Spring InitializingBean和DisposableBean最佳实践

  • 扩展点简述

InitializingBean接口,提供了唯一的方法afterPropertiesSet()。DisposableBean也是接口,提供了唯一的方法destory()。功能分别类似于@PostConstruct和@PreConstruct注解。

前者顾名思义在Bean属性都设置完毕后调用afterPropertiesSet()方法做一些初始化的工作,后者在Bean生命周期结束前调用destory()方法做一些收尾工作。

  • 扩展点的生命周期及扩展点的执行时机

InitializingBean, DisposableBean都属于Bean的实例化阶段扩展,且在Spring的生命周期内只会执行一次。
前者在BeanPostProcessor#postProcessBeforeInitialization方法之后执行,类似@PostConstruct注解作用,后者在Bean将要被Spring销毁的时候被调用,类似@PreConstruct注解作用;

  • 扩展点的作用

InitializingBean: 执行自定义初始化,或仅检查是否已设置所有必填属性。此时属性都已注入。我们有时候必须要等某些Bean完全注入才能进行初始化操作,但使用static块等方式又不太行。

DisposableBean: 执行一些关闭或清理,类似于一个对象的关闭钩子程序。

  • 扩展点实战

/**
 * 作用范围:针对于单个Bean实例
 * 执行时机:对象实例化完成到结束阶段,且只执行一次。
 * 可把 InitializingBean, DisposableBean当作使用Bean阶段的Spring提供的自动执行操作。
 */
@Component
public class TestInitOrDispost implements InitializingBean, DisposableBean {

    /**
     * 执行时机:Bean初始化完成后被调用,但在 BeanPostProcessor接口的postProcessBeforeInitialization方法之后执行。
     * 

* 例如:执行自定义初始化,或仅检查是否已设置所有必填属性。此时属性都已注入。 * 我们有时候必须要等某些Bean完全注入才能进行初始化操作,但使用static块等方式又不太行。 *

* 该方法类似于 @PostConstruct注解,此方法会在该注解之后执行。 */ @Override public void afterPropertiesSet() throws Exception { // InitializingBean接口方法 System.out.println(this.getClass().getName() + "执行对象完全实例化后一些初始化操作"); } /** * 执行时机:Bean将要被Spring销毁的时候被调用。 *

* 例如:执行一些关闭或清理,类似于一个对象的关闭钩子程序。 *

* 该方法类似于 @PreConstruct注解,此方法会在该注解之后执行。 */ @Override public void destroy() throws Exception { // DisposableBean接口方法 System.out.println(this.getClass().getName() + "被销毁了"); } // 注解方式都优先执行 @PostConstruct public void postConstruct() { System.out.println("PostConstruct执行"); } @PreDestroy public void preDestroy() { System.out.println("PreDestroy执行"); } }

更多Spring扩展请查看专题Spring开发笔记。

你可能感兴趣的:(Spring InitializingBean和DisposableBean最佳实践)