天天看點

Spring Bean 生命周期之destroy——終極信仰

上一篇文章 Spring Bean 生命周期之我從哪裡來 說明了

我是誰?

我從哪裡來?

的兩大哲學問題,今天我們要讨論一下終極哲學

我要到哪裡去?

初始化 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;雷隐隐,霧蒙蒙;山花對海樹,赤日對蒼穹;平仄平仄平平仄,仄平仄平仄仄平,仄仄平……

感覺講到這沒必要講下去了,一切清晰明了,但我還有話要說

當 Spring Ioc 容器要移除 bean 時,銷毀相關回調方法将會被執行,這麼做的目的時釋放被 bean 持有的資源,或者去執行一些終極任務. 當 ApplicationContext 調用 registerShutdownHook 方法時,這些銷毀方法就會被觸發,但一般正常的業務中很少會用到這些方法

接下來具體的展示一下三種方法的使用方式

三種銷毀 Spring Bean 的方式

DisposableBean

Spring 為我們提供了 DisposableBean 接口

我們可以通過實作

DisposableBean

接口,在其唯一方法

destroy

内完成 bean 銷毀的工作,但是 Spring Framework 官方并不建議我們通過這種方法來銷毀 bean,這同樣是一種強耦合的方式,我們看到架構層面才會用到這個方法。

這種方式是 Spring 非常提倡的一種方式,我們通常将其标記在方法上即可,通常習慣将這個方法起名為

destory()

同樣是兩種方式,第一種方式:

第二種方式

以上三種 Bean 的銷毀方式也是可以組合使用的,那麼組合在一起的調用順序是什麼呢?

  1. 首先 @PreDestroy 會被調用
  2. 其次 DisposableBean.destroy() 會被調用
  3. 最後調用通過 XML 配置的 destroy-method 方法或通過設定 @Bean 注解 設定 destroyMethod 屬性的方法

用圖示來說明一下調用順序

這個調用順序也不難記憶

PreDestroy

(P)

,destroy

(D)

,destroy-method

(D)

--->

PDD (那個3億人都在 pin 的那個 APP 名稱,目前 3 億人中沒有我)

再來看看 Spring Bean 生命周期圖,我們已經點亮了核心部分:

我們要注意,在銷毀的過程并沒有類似 BeanPostProcess 那中切面的思想,這裡要注意到差別。

靈魂追問

  1. 在閱讀架構源碼時,哪些地方用到了 bean 的銷毀方法?
  2. 還沒有被點亮的地方,你認為還有哪些内容沒有做?

提高效率工具

推薦閱讀

  • 面試還不知道 BeanFactory 和 ApplicationContext 的差別?
  • Spring Bean 生命周期之"我從哪裡來?",懂得這個很重要
  • Spring Bean 生命周期之"我要到哪裡去?"
  • 如何設計好的RESTful API
  • 輕松高效玩轉DTO(Data Transfer Object)

歡迎持續關注公衆号:「日拱一兵」

  • 前沿 Java 技術幹貨分享
  • 高效工具彙總
  • 面試問題分析與解答
  • 技術資料領取

後續會出一系列文章點亮上圖,同時進行 Spring 知識點解釋與串聯,在工作中充分利用 Spring 的特性

另外,還會推出 Java 多線程與 ElasticSearch 相關内容

持續關注,帶你像讀偵探小說一樣輕松趣味學習 Java 技術棧相關知識

繼續閱讀