spring bean生命周期五---Spring Bean 销毁阶段

这个阶段比较简单。分析Bean的销毁阶段-和Bean 的初始化对应!

这里主要分为:Spring Bean 销毁前阶段、销毁阶段。

一、Spring Bean 销毁前阶段

这里主要是处理 DestructionAwareBeanPostProcessor#postProcessBeforeDestruction的实现类回调

如自己实现:

public class MyDestructionAwareBeanPostProcessor implements DestructionAwareBeanPostProcessor {

    @Override
    public void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException {
        if (ObjectUtils.nullSafeEquals("userHolder", beanName) && UserHolder.class.equals(bean.getClass())) {
            UserHolder userHolder = (UserHolder) bean;
            // afterSingletonsInstantiated() = The user holder V8
            // UserHolder description = "The user holder V8"
            userHolder.setDescription("The user holder V9");
            System.out.println("postProcessBeforeDestruction() : " + userHolder.getDescription());
        }
    }
}

二、Spring Bean 销毁阶段

Bean的销毁方式也有三种

注解标注  @preDestory 标注方法

实现 DisposableBean 接口的destroy()方法

自定义销毁方法

其中可以看到@preDestory Java 标准注解销毁,按照字面意思就是按照我们之前的来进行操作。这里的Destory 和我们的这里的销毁其实有点冲突。@preDestpry 主要是指Bean 对象被销毁,也就是说Bean对象被回收之前,也就是被Java GC 之后才被操作。

思考:假设以上三种方式均在同一Bean中定义,那么这些方法的执行顺序是怎样?

案例分析

其实这里我们可以大胆猜测,Bean 的销毁和 Bean 初始化顺序对应  注解标注> 接口实现 > 自定义

注解标注  @preDestory 标注方法

 

实现 DisposableBean 接口的destroy()方法

 

自定义方式实现【这里以Java 注解为案例】

 

 

执行结果分析和猜测结果一样

当我们输出应用上下文准备关闭的时候和已关闭之间,也就是我们调用close()方法的过程中上述方法会被逐一关闭掉 

 

总结

通过三种不同的Bean的销毁方案,同时也对比初始化三种方案来做一个参照,会发现注解总是优先,就是Java 标注注解优化;然后Spring 里面DisposableBean 接口是第二位,第三位就是我们自定义的实现方式!这三种方式可以和Bean 的初始化过程一起去对照了解~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值