Spring Bean 生命周期之“我要到哪里去”?

640?wx_fmt=png



上一篇文章 Spring Bean 生命周期之我从哪里来 说明了我是谁?  我从哪里来? 的两大哲学问题,今天我们要讨论一下终极哲学我要到哪里去?

640?wx_fmt=jpeg

初始化 Spring Bean 有三种方式:

  1. @PostConstruct

  2. InitializingBean.afterPropertiesSet()

  3. init-method

销毁 Spring Bean 同样有三种方式:

  1. @PreDestroy

  2. DisposableBean.destroy()

  3. destroy-method 


正所谓,天对地,雨对风;@PostConstruct 对 @PreDestroy;InitializingBean.afterPropertiesSet() 对 DisposableBean.destroy();init-method 对 destroy-method;雷隐隐,雾蒙蒙;山花对海树,赤日对苍穹;平仄平仄平平仄,仄平仄平仄仄平,仄仄平……

640?wx_fmt=gif

感觉讲到这没必要讲下去了,一切清晰明了,但我还有话要说

 
 

640?wx_fmt=jpeg当 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 Bean 的方式

DisposableBean

 
 

Spring 为我们提供了 DisposableBean 接口

public interface DisposableBean {	
    void destroy() throws Exception;	
}


我们可以通过实现 DisposableBean 接口,在其唯一方法 destroy 内完成 bean 销毁的工作,但是 Spring Framework 官方并不建议我们通过这种方法来销毁 bean,这同样是一种强耦合的方式,我们看到框架层面才会用到这个方法。

@PreDestroy

 
 

这种方式是 Spring 非常提倡的一种方式,我们通常将其标记在方法上即可,通常习惯将这个方法起名为 destory()

@PreDestroy	
    public void destroy() {	
        System.out.println("inside destroy() method");        	
    }	
}


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 的销毁方式也是可以组合使用的,那么组合在一起的调用顺序是什么呢?

  1. 首先 @PreDestroy 会被调用

  2. 其次 DisposableBean.destroy() 会被调用 

  3. 最后调用通过 XML 配置的 destroy-method 方法或通过设置 @Bean 注解 设置 destroyMethod 属性的方法

用图示来说明一下调用顺序640?wx_fmt=jpeg

这个调用顺序也不难记忆

PreDestroy (P),destroy (D),destroy-method (D) ---> PDD (那个3亿人都在 pin 的那个 APP 名称,目前 3 亿人中没有我)

再来看看 Spring Bean 生命周期图,我们已经点亮了核心部分:

640?wx_fmt=jpeg

我们要注意,在销毁的过程并没有类似 BeanPostProcess 那中切面的思想,这里要注意到区别。

灵魂追问

  1. 在阅读框架源码时,哪些地方用到了 bean 的销毁方法?

  2. 还没有被点亮的地方,你认为还有哪些内容没有做?

带着疑问去思考,然后串联,进而归纳总结,不断追问自己,进行自我辩证,像侦查嫌疑案件一样看待技术问题,漆黑的街道,你我一起寻找线索,你就是技术界大侦探福尔摩斯


欢迎持续关注公众号:「日拱一兵」,后续会出一系列文章点亮 Spring Bean 周期图,以完整代码示例说明这个周期的调用顺序;同时进行 Spring 知识点解释与串联,轻松搞定面试那点事,以及在工作中充分利用 Spring 的特性


提高效率工具

640?wx_fmt=png

SizeUp

如果你用外接显示器,需要来回通过鼠标拖动窗口。如果你用一个屏幕,需要反复调整多个窗口的大小,甚至单个显示器上进行分屏,那么 SizeUp 会满足你所有的需求,SizeUp 允许你快速通过键盘 resize 和 position 你的窗口640?wx_fmt=jpeg


推荐阅读


关注公众号,带你像读侦探小说一样趣味学习 Java 技术

640?wx_fmt=png
欢迎思想碰撞,点我留言交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值