在spring
中,从
BeanFactory
或
ApplicationContext
取得的实例为
Singleton
,也就是预设为每一个
Bean
的别名只能维持一个实例,而不是每次都产生一个新的对象使用
Singleton
模式产生单一实例,对单线程的程序说并不会有什么问题,但对于多线程的程序,就必须注意安全
(Thread-safe)
的议题,防止多个线程
同时存取共享资源所引发的数据不同步问题。
然而在spring
中 可以设定每次从
BeanFactory
或
ApplicationContext
指定别名并取得
Bean
时都产生一个新的实例:例如:
<bean id="
studentService
" class="
cn.csdn.service.StudentSrvice
" singleton="false">
在spring
中,
singleton
属性默认是
true
,只有设定为
false
,则每次指定别名取得的
Bean
时都会产生一个新的实例
一个Bean 从创建到销毁,如果是用 BeanFactory 来生成 , 管理 Bean 的话,会经历几个执行阶段 (如图 1.1 ) :
1:
Bean
的建立:
容器寻找Bean 的定义信息并将其实例化。
2:属性注入:
使用依赖注入,
Spring按照
Bean
定义信息配置
Bean
所有属性
3:
BeanNameAware
的
setBeanName()
:
如果Bean
类有实现
org.springframework.beans.BeanNameAware
接口,
工厂调用
Bean的
setBeanName()
方法传递
Bean
的
ID
。
4:
BeanFactoryAware
的
setBeanFactory()
:
如果Bean
类有实现
org.springframework.beans.factory.BeanFactoryAware
接口,
工厂调用
setBeanFactory()方法传入工厂自身。
5:
BeanPostProcessors
的
ProcessBeforeInitialization()
如果
有
org.springframework.beans.factory.config.BeanPostProcessors
和
Bean
关联,那么其
postP
rocessBeforeInitialization()方法
将被将被调用。
6:
initializingBean
的
afterPropertiesSet()
:
如果Bean
类已实现
org.springframework.beans.factory.InitializingBean
接口,则执行他的
afterProPertiesSet()
方法
7:
Bean
定义文件中定义
init-method
:
可以在Bean
定义文件中使用
"init-method"
属性设定方法名称例如:
<bean id="
studentService
" calss="
cn.csdn.service.StudentService
" init-method="init">
如果有以上设置的话,则执行到这个阶段,就会执行initBean()
方法
8:
BeanPostProcessors
的
ProcessaAfterInitialization()
如果有任何的BeanPostProcessors
实例与
Bean
实例关联,则执行
BeanPostProcessors
实例的
ProcessaAfterInitialization()
方法
此时, Bean已经可以被应用系统使用,并且将保留在 BeanFactory 中知道它不在被使用。有两种方法可以将其从 BeanFactory 中删除掉(如图 1.2):
1
:DisposableBean
的
destroy()
在容器关闭时,如果Bean
类有实现
org.springframework.beans.factory.DisposableBean
接口,则执行他的
destroy()
方法
2
:Bean
定义文件中定义
destroy-method
在容器关闭时,可以在Bean
定义文件中使用
"destroy-method"
属性设定方法名称,例如:
<bean id="
studentService
" calss="
cn.csdn.service.StudentService
"destroy-method="destroy">
如果有以上设定的话,则进行至这个阶段时,就会执行destroy()
方法,如果是使用
ApplicationContext
来生成并管理
Bean
的话则稍有不同,使用
ApplicationContext
来生成及管理
Bean
实例的话,在执行
BeanFactoryAware
的
setBeanFactory()
阶段后,若
Bean
类上有实现
org.springframework.context.ApplicationContextAware
接口,则执行其
setApplicationContext()
方法,接着才执行
BeanPostProcessors
的
ProcessBeforeInitialization()
及之后的流程
<!--EndFragment-->