SpringIOC

作者: Grasse | 来源:发表于2017-11-30 19:22 被阅读0次

基本概念

IoC是什么?

如果这个问题要是面试的问题,那么我会这么回答。

IoC(Inversion of Control 控制反转),当然它还有另一个名字,DI(Dependency Injection 依赖注入)。这两个名称其实实质上指的都是同一样的东西。只不过看问题的角度是不一样的。IoC指的是,原来我们需要获得一个对象(Object)的时候,我们的第一想法就是用new。搭配下图,效果更好。

为什么要使用IoC?

现在我们不用new了,是别人给我们的。既然是别人给的,那么,别人可以给,也可以不给。主动权这个时候,肯定就不在我们自己的手里了,在别人的手里了。所以,名叫IoC,控制反转。

为什么要使用IoC?

至于为什么要使用IoC,不用自己new,我说说自己的看法。

Person person= new Asian("Alibaba");

看看,上面的代码可以看出,我们需要一个Person,这个person,我们选择new出来。但实际上new的不是Person本身,而是其继承类,Asian。那如果有一天这个叫Alibaba的亚洲人,不这么想了。程序需要更精确些。是不是要改成下面这样的。

Person person=new Chinese("Alibaba");

那如果改的地方其实还挺多的呢,我们的应用还大呢?【一般公司的应用,都不会小】你还一个个去new,去改吗?

这时候就体现出IoC的优势了,即别人帮你管要new的东西,在Spring的配置文件里面改就好了,给你的这部分代码是不用改的。我们来看看

//读取bean.xml中的内容ApplicationContext ctx =newClassPathXmlApplicationContext("beans.xml");//创建bean的引用对象Person p = ctx.getBean("person");

当然,以上的代码并不难,实际中,我们很有可能也不这么用。但是,本质的意思总归是这个意思的。

我说了这么多,其实就只为了体现一个IoC的优势。

==资源集中管理,实现资源的可配置和易管理。==

这是我画的有关IoC Provider与其他POJO类的关系图,其实本来,Person拥有Pets,Person和Pets都拥有Life是一件再平常不过的事儿。所以原来他们的关系是很紧密的,后来有了IoC Provider之后,就把这三者紧密联系的类分开了。而且,其实分的很开。

你要问,这又有什么优势?看来还是不行啊,还是要整代码。

Person person=newAsian("Alibaba");person.setPet=newDog("Lili");person.setLife=newLife("good");

那我dog改成cat呢,Life改成bad呢?代码的耦合性很强,一个改,个个改。这不就很麻烦吗?如果把bean的管理都交给IoC,那就是IoC帮你管,要变化,IoC变化了之后再给你。不就不用你操心了吗?这还不算优势吗?

优势总结

1、 资源集中管理,实现资源的可配置和易管理。

2、降低了使用资源双方的依赖程度,解耦。

pring还给我们提供了接口,干什么呢?如果你想搞些事情呢?那我不能让你搞,岂不是很不好。开源框架嘛,拓展性非常重要。

接口--BeanFactoryPostProcessor就是做这个工作的,其中有几个Spring自带的,挺有用的BeanFactoryPostProcessor。

① PropertyPlaceHolderConfigurer

从这个类图上就可以看到,PropertyPlaceholderConfigurer间接实现了BeanFactoryPostprocessor。是Spring自带的搞事情实现类。

【主要功能】

为什么叫PropertyPlaceHolderConfigurer,PlaceHolder就叫做占位符,所以这个Configurer主要的功能特点,就是占位符相关的。例如,以下我们这种常见的应用。

很常见吧,我们不直接写值,而是写占位符,然后在其他地方我们再去写值。当然,要用它,必须要把它加上

小课堂的问题

1.BeanFactory和ApplicationContext有什么区别?

BeanFactory 可以理解为含有bean集合的工厂类。BeanFactory 包含了种bean的定义,以便在接收到客户端请求时将对应的bean实例化。

BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。

从表面上看,application context如同bean factory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能。但application context在此基础上还提供了其他的功能。

提供了支持国际化的文本消息

统一的资源文件读取方式

已在监听器中注册的bean的事件

以下是三种较常见的 ApplicationContext 实现方式:

1、ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得。

ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”);

2、FileSystemXmlApplicationContext :由文件系统中的XML配置文件读取上下文。

ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);

3、XmlWebApplicationContext:由Web应用的XML文件读取上下文。

2.Spring有几种配置方式?

基于XML的配置

基于注解的配置

基于Java的配置

基于Groovy DSL的配置

3.Spring Bean的作用域之间有什么区别?

Spring容器中的bean可以分为5个范围

singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。

prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。

request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。

Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。

global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。

全局作用域与Servlet中的session作用域效果相同。

4.请解释自动装配模式的区别?

在Spring框架中共有5种自动装配.

1. no:这是Spring框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在bean定义中用标签明确的设置依赖关系。

2. byName:该选项可以根据bean名称设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的名称自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。

3. byType:该选项可以根据bean类型设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的类型自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。

4. constructor:造器的自动装配和byType模式类似,但是仅仅适用于与有构造器相同参数的bean,如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。

5. autodetect:该模式自动探测使用构造器自动装配或者byType自动装配。首先,首先会尝试找合适的带参数的构造器,如果找到的话就是用构造器自动装配,如果在bean内部没有找到相应的构造器或者是无参构造器,容器就会自动选择byTpe的自动装配方式。

5.请举例解释@Autowired注解?

@Autowired注解对自动装配何时何处被实现提供了更多细粒度的控制。@Autowired注解可以像@Required注解、构造器一样被用于在bean的设值方法上自动装配bean的属性,一个参数或者带有任意名称或带有多个参数的方法。比如,可以在设值方法上使用@Autowired注解来替代配置文件中的元素。当Spring容器在setter方法上找到@Autowired注解时,会尝试用byType 自动装配。

更详细的请看视频视频

PPT PPT

相关文章

  • 手写springioc

    手写简易springIOC springIOC的特点 spring ioc,spring容器,根据xml配置,或者...

  • spring源码解析之SpringIOC源码解析(上)

    SpringIOC源码解析(上) 一、什么是SpringIOC spring ioc指的是控制反转,IOC容器负责...

  • spring bean 生命周期

    springIOC 容器中bean 的生命周期方法 springioc容器可以管理bean的生命周期,spring...

  • springIoc

    1、Ioc(Inverse of control,控制反转) 控制:指对象的控制权 反转:控制权从调用类中移除,由...

  • SpringIOC

    Spring的控制反转(IOC) 把对象的创建初始化、销毁等工作交给spring容器来做,由spring容器来控制...

  • springIOC

    IOC的组成体系结构 1、资源定位(配置文件定位) 2、载入(读取配置文件) 3、注册(把加载以后的配置文件解释成...

  • SpringIOC

    SpringIOC 博客链接 概述 IOC,全称"Inverse Of Control",中文意思为:控制反转。那...

  • SpringIOC

    基本概念 IoC是什么? 如果这个问题要是面试的问题,那么我会这么回答。 IoC(Inversion of Con...

  • SpringIOC

    配置bean class: bean 的全类名,通过反射的方式在IOC容器中创建Bean,所以要求Bean中必须有...

  • SpringIOC

    作为一个容器,通过配置文件或者注解描述类与类之间的依赖关系,自动完成类的初始化和依赖注入的工作 Spring的核心...

网友评论

    本文标题:SpringIOC

    本文链接:https://www.haomeiwen.com/subject/cgkbbxtx.html