首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring IoC器皿的实现描述

2012-08-25 
Spring IoC容器的实现描述1.容器启动阶段》加载配置》分析配置信息》装备到BeanDefinition》其他后处理该阶段

Spring IoC容器的实现描述

1.容器启动阶段
》加载配置
》分析配置信息
》装备到BeanDefinition
》其他后处理

该阶段所做的工作可以认为是准备性的,重点更加侧重于对象管理信息的收集,当然一些验证性或者辅助性的工作也在该阶段完成。

启动过程简述:
①首先会通过某种途径加载配置元数据。
②容器依赖某些工具类(BeanDefinitionReader)对加载的配置元数据进行解析和分析,并将分析后的信息编组为相应的? BeanDefinition。
③最后把这些保存了bean定义必要信息的BeanDefinition,注册到相应的BeanDefinitionRegistry。这样启动工作就完成了。


另:启动过程中对bean信息的修改机制
在容器的启动过程中,Spring提供了一种叫做BeanFactoryPostProcessor的容器扩展机制,运行我们在实例化相应对象之前,对注册到容器的BeanDefinition所保存的信息做相应的修改,比如修改bean定义的某些属性,为bean定义增加其他信息等。

BeanDefinition是用来保存bean实例化阶段将要用到的必要信息的。

2.Bean实例化阶段
》实例化对象
》装配依赖
》生命周期回调
》对象其他处理
》注册回调接口

通过第一阶段,现在所有的bean定义信息都通过BeanDefinition的方式注册到了BeanDefinitionRegistry中;当通过容器的getBean方法请求某个对象时,或者因依赖关系容器需要隐式地调用getBean方法时,就会启动第二个阶段的活动。

在本阶段,容器会检查所请求的对象之前是否已经初始化话。
如果没有,则会根据注册的BeanDefinition所提供的信息实例化被请求的对象,并为其注入依赖。如果该对象实现了某些回调接口,也会根据回调接口的要求来装配它。当该对象装配完毕后,容器立即返回给请求方使用。
如果说第一阶段是根据图纸装配生产线的话,第二阶段就是使用装配好的生产线来生产具体的产品了。

Bean的实例化过程简述:
实例化bean对象-->设置对象属性-->检查Aware相关接口并设置相关依赖-->BeanPostProcessor前置处理 -->检查是否是InitializingBean以决定是否调用afterPropertiesSet方法 -->检查是否配置有自定义的init-method -->BeanPostProcessor后置处理 -->注册必要的Destruction相关回调接口 -->使用中 -->是否实现DisposableBean接口 -->是否配置有自定义的destroy方法
见《Spring揭秘》P75图4-10

当对象实例化完成并且相关属性以及依赖设置完成之后,Spring容器会检查当前对象实例是否实现了一系列以Aware命名结尾的接口定义。如果是,则将这些Aware接口定义中规定的依赖注入给当前对象实例。如以下Aware接口:
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
以上几个Aware接口只是针对BeanFactory类型的容器而言,对于ApplicationContext容器也存在几个Aware接口,不过在检测这些接口并设置相关依赖的原理上与以上几个接口的处理方式不同,使用的是BeanPostProcessor方式。

BeanFactoryPostProcessor存在于容器启动阶段,而BeanPostProcessor是纯在于对象实例化阶段。

BeanPostProcessor除了检查标记接口以便应用自定义的逻辑,还可以对当前对象实例做更多的处理。比如替换当前对象实例或字节码增强当前对象实例。Spring AOP则更多的使用BeanPostProcessor来为当前对象生成相应的代理对象。

将自定义的BeanPostProcessor注册到容器的方法:
对于BeanFactory,需要通过手工编码的方式;
对于ApplicationContext容器来说,则方便得多,直接将相应的BeanPostProcessor实现类通过XML配置文件配置一下即可。ApplicationContext容器会自动加载注册到容器的BeanPostProcessor。例如:将PasswordDecodePostProcessor注册到容器:
<bean id="passwordDecodePostProcessor" class="package.name.PasswordDecodePostProcessor">
<!--如有需要在这里注入必要的依赖-->
</bean>

InitialzingBean和init-method用于对象的自定义初始化,DisposableBean和destroy-method为对象提供了执行自定义销毁逻辑的机会。
最初常见到该功能的场景是在Spring容器中注册数据库连接池,在系统退出后,连接池应该关闭,以释放相应的资源。

这些自定义的对象销毁逻辑,在对象实例化完成并注册了相关回调方法之后,并不会马上执行。只有该对象实例不再被使用的时候,才会执行相关的自定义对象销毁逻辑,此时通常是Spring容器关闭的时候。在Spring容器关闭前不会自动调用这些回调方法。
对于ApplicationContext容器,AbstractApplicationContext为我们提供了registerShutdownHook()方法,该方法底层使用标准的Runtime类的addShutdownHook()方式啦调用相应bean对象的销毁逻辑,从而保证在Java虚拟机退出之前,自定义销毁逻辑会被执行。

?

热点排行