黄春超
评审人:葛振宇、李文君
-
IOC容器概述:
- 容器是什么
- 在Spring中,org.springframwork.context.ApplicationContext这一接口就代表了Spring IOC容器并且用于创建、配置、管理多个对象,并且还可以控制对象的生命周期,该接口常用的一种实现类就是ClassPathXmlApplicationContext,例如:
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml","daos.xml")
,同时我们可以狭隘地认为一个context对象就对应于一个container。
- 在Spring中,org.springframwork.context.ApplicationContext这一接口就代表了Spring IOC容器并且用于创建、配置、管理多个对象,并且还可以控制对象的生命周期,该接口常用的一种实现类就是ClassPathXmlApplicationContext,例如:
- IOC是什么
- IOC是控制反转(Inversion of Control)的简称,说它是一种技术,其实它更偏向于一种被动获取的思想。在我们传统的java中,构造任意一个对象都要通过new这个关键字,即当我们要使用到某个类时,我们先要去主动的创建,然后再来使用。而在Spring中,我们只需要通过各种注解或在配置文件中注册的方式就可以自动生成各种对象,这些对象就是存放在上述所说的容器中,当我们需要使用这些对象的时候,直接从容器中取出相应的对象即可,这种控制方式不仅使得我们更加方便的管理对象,而且还在一定程度上弱化了类和类之间的耦合。总而言之,控制反转就是一种将原本在程序中手动创建对象的控制权交给Spring框架管理的思想。
- 容器是什么
-
Bean概述:
- Bean是什么
-
Bean的本质就是一个对象,通常来说,所有的bean都是由使用者提供给容器的配置数据所创造的。在容器内部,这些bean都是一个个
BeanDefinition
对象,这些对象都包含下列元数据:- 全限定类名:通常代表该bean对象的实现类的包名加类名
- 行为配置元素:表明该bean在容器中的行为(作用域,生命周期回调函数等)
在基于XML的配置元数据中,我们可以使用
id
或者name
者两个属性来指定一个bean对象的名称,并且我们必须保证在整个容器对象中,各个bean的id值都是唯一的。
-
- Bean是什么
- Bean的实例化
- 构造器实例化:使用该方法创建一个bean对象时,相应的类中应该带有一个无参数的构造器,其他的属性通过
set
和get
方法来进行设置或者获取.除此之外,还需要在配置文件中设置bean
元素的id和class属性以方便获取该bean对象。 - 静态工厂方法实例化:使用该方法时必须先定义一个静态工厂类,在静态工厂类中定义一个静态方法用来返回某个实例化对象。具体代码如下:
public class ClientService{
private static ClientService service = new ClinetService();
public ClientService(){}
public ClientService createInstance(){return service;}
}
<bean id="service" class="xxx.xxx.ClientService" factory-method="createInstance">
</bean>
- 实例工厂方式实例化:使用该方法创建bean对象时,不需要通过静态工厂类提供的静态方法来创建实例,而是先在配置文件中创建一个bean元素作为工厂对象,需要实例化的bean也不是通过class属性指向其实例化的类,而是通过
factory-bean
指向工厂对象,然后通过使用factory-method
属性来确定使用工厂对象中的哪个方法。具体配置如下:
<bean id=“serviceLocator” class="examples.DefaultServiceLocator">
</bean>
<bean id="clientService" factory-bean="serviceLocator" factory-method="createClientServiceInstance">
</bean>
上述三种配置都是最简洁的配置,除此之外,还可以根据实际情况设置bean对象是否为单例、是否需要别名等等。
-
DI概述:
- DI概念
- DI是依赖注入(Dependecy Injection)的简称,上述已经提及到IOC是指将对象的创建权反转给Spring容器,这是一种相对宽泛的概念。而我个人感觉DI就是对这种过程进一步的扩展,DI是指在Spring创建对象的过程中,将对象依赖的一些属性(常量、对象)通过配置的方式设置给对象。同时,依赖注入让Spring所管理的bean以配置文件的方式组合在一起,而不是硬编码的方式耦合在一起,这是一种很好的解耦配置,使得代码更加偏向于理想中的
高耦合,低内聚
的特性。
- DI是依赖注入(Dependecy Injection)的简称,上述已经提及到IOC是指将对象的创建权反转给Spring容器,这是一种相对宽泛的概念。而我个人感觉DI就是对这种过程进一步的扩展,DI是指在Spring创建对象的过程中,将对象依赖的一些属性(常量、对象)通过配置的方式设置给对象。同时,依赖注入让Spring所管理的bean以配置文件的方式组合在一起,而不是硬编码的方式耦合在一起,这是一种很好的解耦配置,使得代码更加偏向于理想中的
- 注入方式
- 基于有参构造函数的注入:将一些必要的属性放在构造函数中,使得bean在实例化时就可以得到相应的设置。使用这种方式注入属性是,要遵从下列两个要求:
1.类中必须带有一个有参数构造器。
2.在配置文件中相对应的bean的<constructor-arg>节点中设置name-value、type-value或者index-value这三种键值对方式中的一种来设置,这三种方式分别指通过属性名设置相应的值、通过属性类型设置相应的值、通过索引下标匹配设置相应的值。 - 基于属性的set方法注入:属性注入要求相对应的bean对象必须要有一个无参数的构造器,并且对象中的每一个字段都具有相对应的
set
方法。在具体的执行过程中,Spring容器在xml配置文件通过反射的方式调用无参数构造器先创建出来一个对象,接着通过set方法将配置好的字段的值设置到该对象中去。
- 基于有参构造函数的注入:将一些必要的属性放在构造函数中,使得bean在实例化时就可以得到相应的设置。使用这种方式注入属性是,要遵从下列两个要求:
- DI概念
-
阶段小结:
在Spring的IOC和DI中,我感觉真正在底层起到作用的应该是我们java中的反射机制。xml配置文件中都是一系列字符串,而通过权限定类名来创建实实在在的对象并且给对象初始化等等的一系列过程,就只有反射机制才能做到。同时,我个人感觉阅读文档和一些简单的源码是一种很好的提升能力的方式。