实现Bean初始化回调和销毁回调各有三种方法,一是实现接口方法,二是在XML配置,三是使用注解
初始化回调
1、使用接口
org.springframework.beans.factory.InitializingBean接口类的作用是:在容器设置bean必须的属性之后执行初始化工作。
InitializingBean接口中只有一个方法:void afterPropertiesSet() throws Exception;
实现:
<bean id="CristianoRonaldo" class="twm.spring.LifecycleTest.User" />
public class User implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("调用接口:InitializingBean,方法:afterPropertiesSet,无参数。");
}
}
2、使用XML
<bean id="CristianoRonaldo" class="twm.spring.LifecycleTest.User" init-method="customer_init"/>
public class User {
public void customer_init() {
System.out.println("调用init-method指定的初始化方法:customer_init。" );
}
}
3、使用注解
public class ExampleBean {
@PostConstruct
public void customer_init() {
System.out.println("@PostConstruct注解指定的初始化方法:customer_init。" );
}
}
注意:如果使用java Config,要在@Bean注解中使用initMehtod属性。
销毁回调
1、使用接口
实现org.springframework.beans.factory.DisposableBean接口,作用是Spring销毁bean时调用该方法。
DisposableBean接口只有一个方法:void destroy() throws Exception;
实现:
<bean id="CristianoRonaldo" class="twm.spring.LifecycleTest.User" />
public class User implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("调用接口:DiposibleBean,方法:destroy,无参数。");
}
}
2、使用XML
<bean id="CristianoRonaldo" class="twm.spring.LifecycleTest.User" destroy-method="customer_destory"/>
public class User {
public void customer_destory() {
System.out.println("调用destory-method指定的初始化方法:customer_destory。" );
}
}
3、使用注解
public class User {
@PreDestory
public void customer_destory() {
System.out.println("调用destory-method指定的初始化方法:customer_destory。" );
}
}
全局设置
在顶级元素中定义初使化和销毁函数(必须统一函数名)
<beans default-init-method="customer_init" default-destroy-method="customer_destory">
<bean id="CristianoRonaldo" class="twm.spring.LifecycleTest.User" />
</beans>
总结
1、在一个bean中,配置多种生命周期回调机制,会按照下列次序调用:
带@PostConstruct注解的方法
InitializingBean回调接口中的afterPropertiesSet()方法
自定义的init()方法
2、销毁回调也使用相同的次序
带@PreDestroy注解的方法
DisposableBean回调接口中的destroy()方法
自定义的destroy()方法
3、不管是通过实现 InitializingBean/DisposableBean 接口,还是通过 <bean>
元素的init-method/destroy-method 属性进行配置,都只能为 Bean 指定一个初始化 / 销毁的方法。但是使用 @PostConstruct 和 @PreDestroy 注释却可以指定多个初始化 / 销毁方法,那些被标注 @PostConstruct 或 @PreDestroy 注释的方法都会在初始化 / 销毁时被执行。
4、不建议使用接口和注解实现方式,因为这会让pojo类与Spring框架紧耦合。