上一篇文章 Spring Bean 生命周期之我从哪里来 说明了我是谁?
和 我从哪里来?
的两大哲学问题,今天我们要讨论一下终极哲学我要到哪里去?
初始化 Spring Bean 有三种方式:
销毁 Spring Bean 同样有三种方式:
正所谓,天对地,雨对风;@PostConstruct 对 @PreDestroy;InitializingBean.afterPropertiesSet() 对 DisposableBean.destroy();init-method 对 destroy-method;雷隐隐,雾蒙蒙;山花对海树,赤日对苍穹;平仄平仄平平仄,仄平仄平仄仄平,仄仄平……
感觉讲到这没必要讲下去了,一切清晰明了,但我还有话要说
当 Spring Ioc 容器要移除 bean 时,销毁相关回调方法将会被执行,这么做的目的时释放被 bean 持有的资源,或者去执行一些终极任务. 当 ApplicationContext 调用 registerShutdownHook 方法时,这些销毁方法就会被触发,但一般正常的业务中很少会用到这些方法
public class MainApp {
public static void main(String[] args) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
obj.getMessage();
context.registerShutdownHook();
}
}
接下来具体的展示一下三种方法的使用方式
Spring 为我们提供了 DisposableBean 接口
public interface DisposableBean {
void destroy() throws Exception;
}
我们可以通过实现 DisposableBean
接口,在其唯一方法 destroy
内完成 bean 销毁的工作,但是 Spring Framework 官方并不建议我们通过这种方法来销毁 bean,这同样是一种强耦合的方式,我们看到框架层面才会用到这个方法。
这种方式是 Spring 非常提倡的一种方式,我们通常将其标记在方法上即可,通常习惯将这个方法起名为 destory()
@PreDestroy
public void destroy() {
System.out.println("inside destroy() method");
}
}
同样是两种方式,第一种方式:
public class MyClass {
public void destory() {
// perform destroy logic here
}
}
@Configuration
public class AppConfig {
@Bean(destroyMethod = "destroy")
public MyClass myclass() {
return new MyClass ();
}
}
第二种方式
<bean id="myClass" class="com.demo.MyClass" destory-method="destory"/>
以上三种 Bean 的销毁方式也是可以组合使用的,那么组合在一起的调用顺序是什么呢?
用图示来说明一下调用顺序
这个调用顺序也不难记忆
PreDestroy
(P)
,destroy(D)
,destroy-method(D)
--->PDD (那个3亿人都在 pin 的那个 APP 名称,目前 3 亿人中没有我)
再来看看 Spring Bean 生命周期图,我们已经点亮了核心部分:
我们要注意,在销毁的过程并没有类似 BeanPostProcess 那中切面的思想,这里要注意到区别。
带着疑问去思考,然后串联,进而归纳总结,不断追问自己,进行自我辩证,像侦查嫌疑案件一样看待技术问题,漆黑的街道,你我一起寻找线索,你就是技术界大侦探福尔摩斯