这个阶段比较简单。分析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 的初始化过程一起去对照了解~