在传统的Java
应用中,
bean
的生命周期很简单。使用
Java
关键字
new
进
行
bean
实例化,然后该
bean
就可以使用了。一旦该
bean
不再被使用,
则由
Java
自动进行垃圾回收。
相比之下,Spring
容器中的
bean
的生命周期就显得相对复杂多了。正
确理解
Spring bean
的生命周期非常重要,因为你或许要利用
Spring
提
供的扩展点来自定义
bean
的创建过程。下图
展示了
bean
装载到
Spring
应用上下文中的一个典型的生命周期过程。
正如你所见,在
bean
准备就绪之前,
bean
工厂执行了若干启动步骤。
我们对上图
进行详细描述:
1
.
Spring
对
bean
进行实例化;
2
.
Spring
将值和
bean
的引用注入到
bean
对应的属性中;
3
.如果
bean
实现了
BeanNameAware
接口,
Spring
将
bean
的
ID
传递给
setBean-Name()
方法;
4
.如果
bean
实现了
BeanFactoryAware
接口,
Spring
将调
用
setBeanFactory()
方法,将
BeanFactory
容器实例传入;
5
.如果
bean
实现了
ApplicationContextAware
接口,
Spring
将调
用
setApplicationContext()
方法,将
bean
所在的应用上下文的
引用传入进来;
6
.如果
bean
实现了
BeanPostProcessor
接口,
Spring
将调用它们
的
post-ProcessBeforeInitialization()
方法;
7
.如果
bean
实现了
InitializingBean
接口,
Spring
将调用它们的
after-PropertiesSet()
方法。类似地,如果
bean
使用
init-
method
声明了初始化方法,该方法也会被调用;
8
.如果
bean
实现了
BeanPostProcessor
接口,
Spring
将调用它们
的
post-ProcessAfterInitialization()
方法;
9
.此时,
bean
已经准备就绪,可以被应用程序使用了,它们将一直
驻留在应用上下文中,直到该应用上下文被销毁;
10
.如果
bean
实现了
DisposableBean
接口,
Spring
将调用它的
destroy()
接口方法。同样,如果
bean
使用
destroy-method
声明
了销毁方法,该方法也会被调用。