这是一篇转载,原文来自于 http://www.blogjava.net/huxiaowi/archive/2009/06/23/283775.html?opt=admin
作者是 Charleehu
在 spring 中,从 BeanFactory 或 ApplicationContext 取得的实例为 Singleton ,也就是预设为每一个 Bean 的别名只能维持一个实例,而不是每次都产生
一个新的对象
使用 Singleton 模式产生单一实例,对单线程的程序说并不会有什么问题,但对于多线程的程序,就必须注意安全 (Thread-safe) 的议题,防止多个线程
同时存取共享资源所引发的数据不同步问题。
然而在 spring 中 可以设定每次从 BeanFactory 或 ApplicationContext 指定别名并取得 Bean 时都产生一个新的实例:例如:
<bean id="helloBean" class="onlyfun.caterpillar.HelloBean" singleton="false">
在 spring 中, singleton 属性默认是 true ,只有设定为 false ,则每次指定别名取得的 Bean 时都会产生一个新的实例
一个 Bean 从创建到销毁,如果是用 BeanFactory 来生成 , 管理 Bean 的话,会经历几个执行阶段:
1 : Bean 的建立:
有 BeanFactory 读取 Bean 定义文件,并生成各个 Bean 实例
2 :属性注入:
执行相关的 Bean 属性依赖注入
3 : BeanNameAware 的 setBeanName() :
如果 Bean 类有实现 org.springframework.beans.BeanNameAware 接口,则执行它的 setBeanName() 方法
4 : BeanFactoryAware 的 setBeanFactory() :
如果 Bean 类有实现 org.springframework.beans.factory.BeanFactoryAware 接口,则执行它的 setBeanFactory() 方法
5 : BeanPostProcessors 的 ProcessBeforeInitialization()
如果任何的 org.springframework.beans.factory.config.BeanPostProcessors 实例与 Bean 实例相关。则执行 BeanPostProcessors 实例
的 processBeforeInitialization() 方法
6 : initializingBean 的 afterPropertiesSet() :
如果 Bean 类已实现 org.springframework.beans.factory.InitializingBean 接口,则执行他的 afterProPertiesSet() 方法
7 : Bean 定义文件中定义 init-method :
可以在 Bean 定义文件中使用 "init-method" 属性设定方法名称例如:
<bean id="helloBean" calss="onlyfun.caterpillar.HelloBean" init-method="initBean">
如果有以上设置的话,则执行到这个阶段,就会执行 initBean() 方法
8 : BeanPostProcessors 的 ProcessaAfterInitialization()
如果有任何的 BeanPostProcessors 实例与 Bean 实例关联,则执行 BeanPostProcessors 实例的 ProcessaAfterInitialization() 方法
9 : DisposableBean 的 destroy()
在容器关闭时,如果 Bean 类有实现 org.springframework.beans.factory.DisposableBean 接口,则执行他的 destroy() 方法
10 : Bean 定义文件中定义 destroy-method
在容器关闭时,可以在 Bean 定义文件中使用 "destroy-method" 属性设定方法名称,例如:
<bean id="helloBean" class="onlyfun.caterpillar.HelloBean" destroy-method="destroyBean">
如果有以上设定的话,则进行至这个阶段时,就会执行 destroyBean() 方法,如果是使用 ApplicationContext 来生成并管理 Bean 的话则稍有不同,使用 ApplicationContext 来生成及管理 Bean 实例的话,在执行 BeanFactoryAware 的 setBeanFactory() 阶段后,若 Bean 类上有实现 org.springframework.context.ApplicationContextAware 接口,则执行其 setApplicationContext() 方法,接着才执行 BeanPostProcessors 的 ProcessBeforeInitialization() 及之后的流程