第一种方式:JSR标准
该种方式通过JSR-250的标准,也是建议使用的。具体讲,我们可以通过JSR的 @PostConstruct 和 @PreDestroy 这2个注解在bean的初始化完成和销毁之前实现一些逻辑操作。
- 下面是我们定义的 bean
public class FooBean {
private static final Logger logger = LoggerFactory.getLogger(FooBean.class);
private Integer id;
private String name;
/**
* 相关知识点见 spring framework 文档 7.6 节 109 页
*
* 替换 InitializingBean 和 DisposableBean,因为这俩和 spring 耦合
*
* 建议使用的自定义 bean 特性的方式(Java 标准)
*/
@PostConstruct
public void beanLifeCircleInJavaOfInitialize() {
logger.info("使用 JSR-250 的 @PostConstruct 来干预 bean 的生命周期 : 初始化 {}", FooBean.class);
}
@PreDestroy
public void beanLifeCircleInJavaOfDestroy() {
logger.info("使用 JSR-250 的 @PreDestroy 来干预 bean 的生命周期 : 销毁 {}", FooBean.class);
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 注入该 bean
@Bean
public FooBean createFooBean() {
return new FooBean();
}
- 查看
第二种方式:使用@Bean注解的initMethod和destroyMethod属性指定生命周期回调(函数|方法)
- 下面是我们定义的 bean
public class BarBean {
private static final Logger logger = LoggerFactory.getLogger(FooBean.class);
private Integer id;
private String name;
/**
* 相关知识点见 spring framework 文档 7.6 节 109 页
*
* 替换 InitializingBean,因为它和 spring 耦合
*/
public void init() {
logger.info("使用 @Bean 的 initMethod 属性来干预 bean 的生命周期 : 初始化 {}", BarBean.class);
}
/**
* 相关知识点见 spring framework 文档 7.6 节 109 页
*
* 替换 DisposableBean,因为它和 spring 耦合
*/
public void destroy() {
logger.info("使用 @Bean 的 destroyMethod 属性来干预 bean 的生命周期 : 销毁 {}", BarBean.class);
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 注入该bean
@Bean(initMethod = "init", destroyMethod = "destroy")
public BarBean createBarBean() {
return new BarBean();
}
- 查看
第三种方式:实现 Spring 的接口
该种方式是通过实现 Spring 的 InitializingBean 和 DisposableBean 这2个接口来实现的
- 下面是我们定义的bean
public class TeeBean implements InitializingBean, DisposableBean {
private static final Logger logger = LoggerFactory.getLogger(FooBean.class);
private Integer id;
private String name;
@Override
public void afterPropertiesSet() throws Exception {
logger.info("使用 Spring 的 InitializingBean 来干预 bean 的生命周期,初始化:{}", TeeBean.class);
}
@Override
public void destroy() throws Exception {
logger.info("使用 Spring 的 DisposableBean 来干预 bean 的生命周期,销毁:{}", TeeBean.class);
}
public static Logger getLogger() {
return logger;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 注入该 bean
@Bean
public TeeBean createTeeBean() {
return new TeeBean();
}
- 查看
好了,以上就是三种干预bean生命周期的实现方式。但是,本例子只是通过打印日志并查看日志的方式来说明这三种方式都是可以工作的,实践中,我们可以通过这三种方式实现更复杂的业务逻辑。