摘要:上一篇文章生命周期之我從哪里來說明了我是誰和我從哪里來的兩大哲學(xué)問題,今天我們要討論一下終極哲學(xué)我要到哪里去初始化有三種方式銷毀同樣有三種方式正所謂,天對地,雨對風(fēng)對對對雷隱隱,霧蒙蒙山花對海樹,赤日對蒼穹平仄平仄平平仄,仄平仄平仄
上一篇文章 Spring Bean 生命周期之我從哪里來 說明了我是誰? 和 我從哪里來? 的兩大哲學(xué)問題,今天我們要討論一下終極哲學(xué)我要到哪里去?
初始化 Spring Bean 有三種方式:
@PostConstruct
InitializingBean.afterPropertiesSet()
init-method
銷毀 Spring Bean 同樣有三種方式:
@PreDestroy
DisposableBean.destroy()
destroy-method
正所謂,天對地,雨對風(fēng); @PostConstruct 對 @PreDestroy;InitializingBean.afterPropertiesSet() 對 DisposableBean.destroy(); init-method 對 destroy-method;雷隱隱,霧蒙蒙;山花對海樹,赤日對蒼穹;平仄平仄平平仄,仄平仄平仄仄平,仄仄平……
感覺講到這沒必要講下去了,一切清晰明了,但我還有話要說
當 Spring Ioc 容器要移除 bean 時,銷毀相關(guān)回調(diào)方法將會被執(zhí)行,這么做的目的時釋放被 bean 持有的資源,或者去執(zhí)行一些終極任務(wù). 當 ApplicationContext 調(diào)用 registerShutdownHook 方法時,這些銷毀方法就會被觸發(fā),但一般正常的業(yè)務(wù)中很少會用到這些方法
接下來具體的展示一下三種方法的使用方式
三種銷毀 Spring Bean 的方式 DisposableBeanSpring 為我們提供了 DisposableBean 接口
我們可以通過實現(xiàn) DisposableBean 接口,在其唯一方法 destroy 內(nèi)完成 bean 銷毀的工作,但是 Spring Framework 官方并不建議我們通過這種方法來銷毀 bean,這同樣是一種強耦合的方式,我們看到框架層面才會用到這個方法。
@PreDestroy這種方式是 Spring 非常提倡的一種方式,我們通常將其標記在方法上即可,通常習(xí)慣將這個方法起名為 destory()
destroy-method同樣是兩種方式,第一種方式:
第二種方式
以上三種 Bean 的銷毀方式也是可以組合使用的,那么組合在一起的調(diào)用順序是什么呢?
首先 @PreDestroy 會被調(diào)用
其次 DisposableBean.destroy() 會被調(diào)用
最后調(diào)用通過 XML 配置的 destroy-method 方法或通過設(shè)置 @Bean 注解 設(shè)置 destroyMethod 屬性的方法
用圖示來說明一下調(diào)用順序
這個調(diào)用順序也不難記憶
PreDestroy (P),destroy (D),destroy-method (D) ---> PDD (那個3億人都在 pin 的那個 APP 名稱,目前 3 億人中沒有我)
再來看看 Spring Bean 生命周期圖,我們已經(jīng)點亮了核心部分:
我們要注意,在銷毀的過程并沒有類似 BeanPostProcess 那中切面的思想,這里要注意到區(qū)別。
靈魂追問在閱讀框架源碼時,哪些地方用到了 bean 的銷毀方法?
還沒有被點亮的地方,你認為還有哪些內(nèi)容沒有做?
提高效率工具 推薦閱讀面試還不知道 BeanFactory 和 ApplicationContext 的區(qū)別?
Spring Bean 生命周期之"我從哪里來?",懂得這個很重要
Spring Bean 生命周期之"我要到哪里去?"
如何設(shè)計好的RESTful API
輕松高效玩轉(zhuǎn)DTO(Data Transfer Object)
歡迎持續(xù)關(guān)注公眾號:「日拱一兵」前沿 Java 技術(shù)干貨分享
高效工具匯總
面試問題分析與解答
技術(shù)資料領(lǐng)取
后續(xù)會出一系列文章點亮上圖,同時進行 Spring 知識點解釋與串聯(lián),在工作中充分利用 Spring 的特性
另外,還會推出 Java 多線程與 ElasticSearch 相關(guān)內(nèi)容
持續(xù)關(guān)注,帶你像讀偵探小說一樣輕松趣味學(xué)習(xí) Java 技術(shù)棧相關(guān)知識
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75307.html
摘要:代碼示例自定義實現(xiàn)注冊運行和預(yù)想一樣,輸出結(jié)果為,如果移除掉注解的屬性,輸出結(jié)果為總結(jié)在大多數(shù)情況下,我們應(yīng)該避免使用任何接口,除非我們需要它們。 showImg(https://segmentfault.com/img/remote/1460000019807821?w=1920&h=1080); 通過如下前序兩篇文章: Spring Bean 生命周期之我從哪里來? Spring...
摘要:事件事件監(jiān)聽器,對監(jiān)聽到的事件進行處理。擁有一個成員變量,提供了容器監(jiān)聽器的注冊表。注冊事件監(jiān)聽器根據(jù)反射機制,使用的方法,從中找出所有實現(xiàn)的,將它們注冊為容器的事件監(jiān)聽器,實際的操作就是將其添加到事件廣播器所提供的監(jiān)聽器注冊表中。 1. Spring的資源抽象接口 假如有一個文件位于Web應(yīng)用的類路徑下,用戶可以通過以下方式對這個文件資源進行訪問: 通過FileSystemReso...
摘要:在中注入注入運行結(jié)果注入使用注解正如其名在構(gòu)造器之后,即在銷毀之前。調(diào)用的方法構(gòu)造器注入屬性注入顧名思義,在這個方法里面可以拿到所有裝載的并在初始化之前對某些進行修改。 先看一張圖:spring4.x 企業(yè)實戰(zhàn) showImg(https://segmentfault.com/img/bVbbO72?w=608&h=502); spring版本:4.3.171、bean自身的生命周期接...
摘要:目前建議使用與。入?yún)⑹钱斍罢谔幚淼模钱斍暗呐渲妹?,返回的對象為處理后的。如果,則將放入容器的緩存池中,并返回。和這兩個接口,一般稱它們的實現(xiàn)類為后處理器。體系結(jié)構(gòu)讓容器擁有了發(fā)布應(yīng)用上下文事件的功能,包括容器啟動事件關(guān)閉事件等。 點擊進入我的博客 1 如何理解IoC 1.1 依然是KFC的案例 interface Burger { int getPrice(); } in...
摘要:如果該方法的返回值代替原本該生成的目標對象,后續(xù)只有方法會調(diào)用,其它方法不再調(diào)用否則按照正常的流程走方法在目標對象實例化之后調(diào)用,這個時候?qū)ο笠呀?jīng)被實例化,但是該實例的屬性還未被設(shè)置,都是。 我們可能會在 Bean 對象創(chuàng)建完成后, 執(zhí)行某些操作或在銷毀前做某些操作. 我們可以實現(xiàn) InitializingBean 或 DisposableBean 接口 public class Te...
閱讀 1387·2021-10-08 10:04
閱讀 2710·2021-09-22 15:23
閱讀 2733·2021-09-04 16:40
閱讀 1185·2019-08-29 17:29
閱讀 1504·2019-08-29 17:28
閱讀 3001·2019-08-29 14:02
閱讀 2230·2019-08-29 13:18
閱讀 856·2019-08-23 18:35