美文网首页
Spring InitializingBean和Disposab

Spring InitializingBean和Disposab

作者: 单名一个冲 | 来源:发表于2021-03-10 14:03 被阅读0次
  • 扩展点简述

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方法之后执行。
     * <p>
     * 例如:执行自定义初始化,或仅检查是否已设置所有必填属性。此时属性都已注入。
     * 我们有时候必须要等某些Bean完全注入才能进行初始化操作,但使用static块等方式又不太行。
     * <p>
     * 该方法类似于 @PostConstruct注解,此方法会在该注解之后执行。
     */
    @Override
    public void afterPropertiesSet() throws Exception { // InitializingBean接口方法
        System.out.println(this.getClass().getName() + "执行对象完全实例化后一些初始化操作");
    }

    /**
     * 执行时机:Bean将要被Spring销毁的时候被调用。
     * <p>
     * 例如:执行一些关闭或清理,类似于一个对象的关闭钩子程序。
     * <p>
     * 该方法类似于 @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和Disposab

      本文链接:https://www.haomeiwen.com/subject/kfsyqltx.html