美文网首页
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