在这篇文章中我们开始学习Bean的生命周期相关的知识,整个Bean的生命周期可以分为以下几个阶段:
1)实例化(得到一个还没有经过属性注入跟初始化的对象)
2)属性注入(得到一个经过了属性注入但还没有初始化的对象)
3)初始化(得到一个经过了初始化但还没有经过AOP的对象,AOP会在后置处理器中执行)
4)销毁
生命周期回调
1、Bean初始化回调
实现初始化回调方法,有以下三种形式
1)实现InitializingBean接口
如下:
public class AnotherExampleBean implements InitializingBean {
public void afterPropertiesSet() {
// do some initialization work
}
}
2)使用Bean标签中的init-method属性
配置如下:
<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>
public class ExampleBean {
public void init() {
// do some initialization work
}
}
3)使用@PostConstruct注解
配置如下:
public class ExampleBean {
@PostConstruct
public void init() {
// do some initialization work
}
}
2、Bean销毁回调
实现销毁回调方法,有以下三种形式
1)实现DisposableBean接口
public class AnotherExampleBean implements DisposableBean {
public void destroy() {
// do some destruction work (like releasing pooled connections)
}
}
2)使用Bean标签中的destroy-method属性
<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/>
public class ExampleBean {
public void cleanup() {
// do some destruction work (like releasing pooled connections)
}
}
3)使用@PreDestroy注解
public class ExampleBean {
@PreDestroy
public void cleanup() {
// do some destruction work (like releasing pooled connections)
}
}
3、配置默认的初始化及销毁方法
我们可以通过如下这种配置,为多个Bean同时指定初始化或销毁方法
<beans default-init-method="init" default-destroy-method="destory">
<bean id="blogService" class="com.something.DefaultBlogService">
<property name="blogDao" ref="blogDao" />
</bean>
</beans>
在上面的XML配置中,Spring会将所有处于beans标签下的Bean的初始化方法名默认为init,销毁方法名默认为destory。
但是如果我们同时在bean标签中也指定了init-method属性,那么默认的配置将会被覆盖。
4、执行顺序
如果我们在配置中同时让一个Bean实现了回调接口,又在Bean标签中指定了初始化方法,还进行了
@PostContruct注解的配置的话,那么它们的执行顺序如下:
被@PostConstruct所标记的方法
InitializingBean 接口中的afterPropertiesSet() 方法
Bean标签中的 init()方法
对于销毁方法执行顺序如下:
被@PreDestroy所标记的方法
destroy() DisposableBean 回调接口中的destroy()方法
Bean标签中的 destroy()方法
我们可以总结如下:
注解的优先级 > 实现接口的优先级 > XML配置的优先级
同时我们需要注意的是,官网推荐我们使用注解的形式来定义生命周期回调方法,这是因为相比于实现接口,采用注解这种方式我们的代码跟Spring框架本身的耦合度更加低。