BeanFactory和ApplicationContext
BeanFactory是IOC的核心组建,可以实现创建Bean实例,并进行bean的组装工作(依赖注入), ApplicatonContext是BeanFactory的子接口,在BeanFactory的基础之上增加了国际化支持和对Bean声明周期的管理。在绝大多数的应用里我们都使用ApplicatonContext接口来进行编成 。
BeanFactory中的所有javabean是懒汉式加载
ApplicationContext中的所有singleton 的 javabean都是采用预先加载,即在ApplicationContext被创建时就已经加载完毕 。
可通过构造函数来进行验证
Signleton Bean
由于进行依赖注入的大部分是业务对象( BO) ,所以在Spring中所有bean对象默认都采用singleton模式,以减少Bean创建和销毁而带来的系统开销,这要求所有bean因该具有线程安全的特点。如果某个Bean不能采用singleton模式来创建,需要在配置文件中特殊指明:
<bean id=”xxxx” class=”xxxxxx” singleton=”false”>…… </bean>
可以通过将同一个bean获取两次,比较状态来验证 :
Student stu = (Student)ctx.getBean( “stu” );
stu.setName( “lisi” ) ;
Student stu2 = (Student)ctx.getBean( “stu” ) ;
System.out.println( stu2.getName() ) ;
我们会发现sut2的名字与stu一致,可证明singleton特性
通过构造函数进行依赖注入
使用<property></property>进行依赖注入时,使用的是bean的set方法,另外一种进行注入的方式就是构造函数 .
<bean id=”student” class=”ioc.bean.Student”>
<construct-arg>
<value></value> |<ref bean=””/> | list | set | map | props
</construct-arg>
</bean>
解决构造函数参数的不确定性
当bean存在多个参数时,spring 会根据参数类型来进行注入,但是当存在多个相同类型的参数时,就需要在配置文件中指明参数的顺序 :参数顺序从0开始
<constructor-arg index=” 0” >
</constructor-arg>
<constructor-arg index=” 1” >
</constructor-arg>
一般set注入优于构造函数注入,一方面构造函数参数顺序的调整会影响到注入的结果,另一方面set注入会使spring的配置文件可读性更好一些。
自动注入
后处理bean BeanPostProcessor
实现接口 BeanPostProcessor , 可以在ApplicationContext实例化每一个类之后对刚刚实例化的对象进行处理 。
Public interface BeanPostPorcessor{
Public Object postProcessBeforeInitialization( Object bean , String beanName );
Public Object postProcessAfterInitialization( Object bean , String beanName ;
}
通常情况向,我们可以在这里生成bean的代理对象,将代理对象返回给ApplicationContext进行使用。
Bean的生命周期
实例化 |
依赖注入 |
实例化 |
POSTBean
|
|
实例化 |
分散spring的配置文件
如果使用ApplicationContext对象的话,可以将Bean的配置信息分散到多个配置文件中 。