Spring的三种回调init和destroy方法的方式
1.实现InitializingBean和DisposableBean 接口
实现InitializingBean接口重写的afterPropertiesSet方法,可以在bean初始化完成以后回调
实现DisposableBean接口重写的destroy方法,在容器移除bean的时候执行。
实现这两个接口的bean可以在bean的生命周期中自定义初始化和销毁逻辑
2.声明SpringBean时指定initmthod 和 destroymethod
A.如果使用xml配置文件方式
在<bean 标签中指定
<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init" destroy-method="cleanup"/>
public class ExampleBean {
public void init() {
// do some initialization work
}
public void cleanup() {
// do some destruction work (like releasing pooled connections)
}
}
B.如果使用java注解方式配置
在@Bean注解中指定
public class BeanOne {
public void init() {
// initialization logic
}
}
public class BeanTwo {
public void cleanup() {
// destruction logic
}
}
@Configuration
public class AppConfig {
@Bean(initMethod = "init")
public BeanOne beanOne() {
return new BeanOne();
}
@Bean(destroyMethod = "cleanup")
public BeanTwo beanTwo() {
return new BeanTwo();
}
}
3.使用JSR250提供的@PostConstruct and @PreDestroy
一个类中只能有一个方法被@**PostConstruct **注解,表明这个方法是bean的init方法。
同样的,@PreDestroy注解表明当前方法是bean的destroy方法。
比较推荐使用这种方式来写,相对于第一种更直观,没有和spring提供的接口耦合在一起
参考文档:https://docs.spring.io/spring/docs/5.1.5.RELEASE/spring-framework-reference/core.html#beans-factory-lifecycle-initializingbean
4.实现BeanPostProcessor接口
实现postProcessBeforeInitialization和postProcessAfterInitialization方法在对象初始化前后进行增强
5.以上两种或者三种方式同时使用
5.1多种方式指定的方法名各不相同
按照以下顺序依次执行
- 带@PostConstruct或@Predestroy注解的方法
- 实现InitializingBean回调接口定义的afterPropertiesSet()方法
- 使用xml中init-method或@Bean注解中的initMethod指定的自定义方法
5.2 多种方式指定同一个方法
指定的这个初始化或者销毁方法只会执行一次