Spring DestorySingleton流程
- 2019 年 10 月 13 日
- 筆記
第一節介紹Spring啟動(鏈接)時,介紹AbstractApplicationContext的過銷毀過程,主要是調用了內部的destroyBeans方法,這節便來介紹bean的銷毀過程。
一.銷毀流程
destroyBeans方法內部委託給了DefaultSingletonBeanRegistry的destroySingletons方法。destroySingletons方法如下,比較清晰:
前面介紹過,DefaultSingletonBeanRegistry用一個Map快取著所有的單例實例,對於對象的銷毀,只要簡單的將其從Map中移除就行。主要處理的是依賴關係下的bean銷毀順序以及回調介面的處理。上面先對disposableBeans中所涉及到的bean逐個進行銷毀,然後再清理所有的依賴關係和快取的單例實例。
上一節提到,disposableBeans中存放的是存在銷毀時需要進行方法回調的DisposableBeanAdapter對象,key為對應的bean name,會在bean初始化後進行判斷並且存入。這裡會優先處理這些bean的銷毀,下面重點介紹下destroySingleton方法。
二.destroySingleton
如上描述了該方法的大致過程,分別為
-
將DefaultSingletonBeanRegistry中快取的各種單例實例清除掉
-
執行disposableBeans.remove方法,移除該beanName,這裡會返回一個DisposableBean對象
- 刪除dependentBeanMap中beanName的內容,也是執行remove的方法,會返回依賴於beanName的其他bean name列表,再依次調用destorySingleton銷毀這些bean
-
對當前的DisposableBean執行destory
-
刪除containedBeanMap中beanName的內容,執行的remove方法,hi返回beanName依賴的其他bean name列表,再依次調用destorySingleton銷毀這些bean
從而具體的回調發生在第4步,開頭提到,bean在實例化後會以DisposableBeanAdapter存放進disposableBeans中,從而該類實現了具體的回調過程。
三.DisposableBeanAdapter
DisposableBeanAdapter的結構如下,其實現了DisposableBean介面,因而可以如上面說的,在destroySingleton方法進行回調。它在構造方法中對幾個重要的屬性進行了賦值,用於存儲銷毀動作相關的資訊,包括:
-
Bean:待銷毀bean對象
-
beanName:待銷毀bean的beanName
-
destroyMethodName:待銷毀要調用的方法,該方法來源於destory-method配置項,如果為(inferred),則會將回調方法賦值為close或者shutdown
-
destoryMethod:destoryMethodName對應的Method對象
-
beanPostProcessors:需要處理該bean的DestructionAwareBeanPostProcessor回調列表。在實例化DisposableBeanAdapter對象時,會過濾系統中的BeanPostProcessor列表,找出實現DestructionAwareBeanPostProcessor介面,且requiresDestruction方法返回true的實例,用於後續進行回調。(InitDestroyAnnotationBeanPostProcessor類實現了該方法,用以回調@PreDestory註解的方法,CommonAnnotationBeanPostProcessor繼承自該類,設置了destroyAnnotationType為PreDestroy.class)
當按照第(二)部分第4步執行時,該類會按照如下順序執行銷毀動作:
-
如果beanPostProcessors列表不為空,則回調DestructionAwareBeanPostProcessor的postProcessBeforeDestruction方法,即執行@PreDestory註解方法
-
如果實現了DisposableBean,則回調DisposableBean的destroy方法,即執行DisposableBean介面方法
-
如果配置了destroy-method,則執行配置的方法,即執行destory-method配置方法
個人公眾號:啊駝