官方推荐
从以上官方文档看,不管是初始化还是销毁,更推荐使用@PostConstruct /@PreDestroy 和 init-method / destroy-method 方式,不推荐使用实现InitializingBean / DisposableBean 接口方式,因为这种方式与Spring耦合性更强。
下面我们就来看看每种方式,如何实现。
初始化
我们在对bean进行一些自定义初始化时,可以使用
- @PostConstruct
- 实现InitializingBean接口的afterPropertiesSet()方法
- @Bean(initMethod = “initMethod”)
- 在xml文件中,设置全局default-init-method=“init”
public class TestInit implements InitializingBean {
private String name;
public TestInit() {
System.out.println("construct");
if(name != null) {
System.out.println("Get name: "+name);
}
}
@PostConstruct // 方式一
public void postConstruct() {
System.out.println("postConstruct");
if(name != null) {
System.out.println("Get name: "+name);
}
}
@Override // 方式二
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet");
if(name != null) {
System.out.println("Get name: "+name);
}
}
public void initMethod() {
System.out.println("initMethod");
if(name != null) {
System.out.println("Get name: "+name);
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Component
public class InitDemo {
@Bean(initMethod = "initMethod") // 方式三
public TestInit initTest() {
TestInit test = new TestInit();
test.setName("name11");
return test;
}
}
public class MainTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(InitDemo.class);
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
default-init-method="init" default-destroy-method="destroy">
<!-- 方式四 -->
<context:component-scan base-package="bean.dfault.callbacLks"/>
</beans>
方式四,没有试验,请各位验证。
输出结果
construct
postConstruct
Get name: name11
afterPropertiesSet
Get name: name11
initMethod
Get name: name11
结果说明,程序执行顺序为:
construct > 属性设置 > @PostConstruct > InitializingBean.afterPropertiesSet() > initMethod
[图片来源于网络]
销毁
跟初始化同样,我们在销毁前也可以进行一些自定义操作,
- @PreDestroy注解
- 实现DisposableBean接口的destroy()方法
- @Bean(destroyMethod = “destroyMethod”)
- default-destroy-method="destroy"方法,同初始化的xml设置
public class TestDestroy implements DisposableBean {
@PreDestroy // 方式一
public void preDestroy() {
System.out.println("preDestroy");
}
@Override // 方式二
public void destroy() throws Exception {
System.out.println("destroy");
}
public void destroyMethod() {
System.out.println("destroyMethod");
}
}
@Component
public class DestroyDemo {
@Bean(destroyMethod = "destroyMethod") // 方式三
public TestDestroy testDestroy() {
return new TestDestroy();
}
}
public class MainTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(DestroyDemo.class);
//This is important
context.registerShutdownHook();
}
}
输出结果
preDestroy
destroy
destroyMethod
说明执行的顺序为:
@PreDestroy > DisposableBean.destroy() > destroyMethod
[图片来源于网络]