上一篇文章 Spring Bean 生命週期之我從哪裏來 說明了我是誰?
和 我從哪裏來?
的兩大哲學問題,今天我們要討論一下終極哲學我要到哪裏去?
[center]
初始化 Spring Bean 有三種方式:
- @PostConstruct
- InitializingBean.afterPropertiesSet()
- init-method
銷燬 Spring Bean 同樣有三種方式:
- @PreDestroy
- DisposableBean.destroy()
- 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,這同樣是一種強耦合的方式,我們看到框架層面纔會用到這個方法。
@PreDestroy
這種方式是 Spring 非常提倡的一種方式,我們通常將其標記在方法上即可,通常習慣將這個方法起名爲 destory()
destroy-method
同樣是兩種方式,第一種方式:
第二種方式
以上三種 Bean 的銷燬方式也是可以組合使用的,那麼組合在一起的調用順序是什麼呢?
- 首先 @PreDestroy 會被調用
- 其次 DisposableBean.destroy() 會被調用
- 最後調用通過 XML 配置的 destroy-method 方法或通過設置 @Bean 註解 設置 destroyMethod 屬性的方法
用圖示來說明一下調用順序
這個調用順序也不難記憶
PreDestroy
(P)
,destroy(D)
,destroy-method(D)
--->PDD (那個3億人都在 pin 的那個 APP 名稱,目前 3 億人中沒有我)
再來看看 Spring Bean 生命週期圖,我們已經點亮了核心部分:
我們要注意,在銷燬的過程並沒有類似 BeanPostProcess 那中切面的思想,這裏要注意到區別。
靈魂追問
- 在閱讀框架源碼時,哪些地方用到了 bean 的銷燬方法?
- 還沒有被點亮的地方,你認爲還有哪些內容沒有做?
提高效率工具
推薦閱讀
- 面試還不知道 BeanFactory 和 ApplicationContext 的區別?
- Spring Bean 生命週期之"我從哪裏來?",懂得這個很重要
- Spring Bean 生命週期之"我要到哪裏去?"
- 如何設計好的RESTful API
- 輕鬆高效玩轉DTO(Data Transfer Object)
歡迎持續關注公衆號:「日拱一兵」
- 前沿 Java 技術乾貨分享
- 高效工具彙總
- 面試問題分析與解答
- 技術資料領取
後續會出一系列文章點亮上圖,同時進行 Spring 知識點解釋與串聯,在工作中充分利用 Spring 的特性
另外,還會推出 Java 多線程與 ElasticSearch 相關內容
持續關注,帶你像讀偵探小說一樣輕鬆趣味學習 Java 技術棧相關知識