Spring DestorySingleton流程

  • 2019 年 10 月 13 日
  • 筆記

 第一節介紹Spring啟動(鏈接)時,介紹AbstractApplicationContext的過銷毀過程,主要是調用了內部的destroyBeans方法,這節便來介紹bean的銷毀過程。

一.銷毀流程

destroyBeans方法內部委託給了DefaultSingletonBeanRegistry的destroySingletons方法。destroySingletons方法如下,比較清晰:

file

 前面介紹過,DefaultSingletonBeanRegistry用一個Map快取著所有的單例實例,對於對象的銷毀,只要簡單的將其從Map中移除就行。主要處理的是依賴關係下的bean銷毀順序以及回調介面的處理。上面先對disposableBeans中所涉及到的bean逐個進行銷毀,然後再清理所有的依賴關係和快取的單例實例。

 上一節提到,disposableBeans中存放的是存在銷毀時需要進行方法回調的DisposableBeanAdapter對象,key為對應的bean name,會在bean初始化後進行判斷並且存入。這裡會優先處理這些bean的銷毀,下面重點介紹下destroySingleton方法。

二.destroySingleton

file

 如上描述了該方法的大致過程,分別為

  1. 將DefaultSingletonBeanRegistry中快取的各種單例實例清除掉

  2. 執行disposableBeans.remove方法,移除該beanName,這裡會返回一個DisposableBean對象

  3. 刪除dependentBeanMap中beanName的內容,也是執行remove的方法,會返回依賴於beanName的其他bean name列表,再依次調用destorySingleton銷毀這些bean
  4. 對當前的DisposableBean執行destory

  5. 刪除containedBeanMap中beanName的內容,執行的remove方法,hi返回beanName依賴的其他bean name列表,再依次調用destorySingleton銷毀這些bean
    從而具體的回調發生在第4步,開頭提到,bean在實例化後會以DisposableBeanAdapter存放進disposableBeans中,從而該類實現了具體的回調過程。

三.DisposableBeanAdapter

 DisposableBeanAdapter的結構如下,其實現了DisposableBean介面,因而可以如上面說的,在destroySingleton方法進行回調。它在構造方法中對幾個重要的屬性進行了賦值,用於存儲銷毀動作相關的資訊,包括:

  1. Bean:待銷毀bean對象

  2. beanName:待銷毀bean的beanName

  3. destroyMethodName:待銷毀要調用的方法,該方法來源於destory-method配置項,如果為(inferred),則會將回調方法賦值為close或者shutdown

  4. destoryMethod:destoryMethodName對應的Method對象

  5. beanPostProcessors:需要處理該bean的DestructionAwareBeanPostProcessor回調列表。在實例化DisposableBeanAdapter對象時,會過濾系統中的BeanPostProcessor列表,找出實現DestructionAwareBeanPostProcessor介面,且requiresDestruction方法返回true的實例,用於後續進行回調。(InitDestroyAnnotationBeanPostProcessor類實現了該方法,用以回調@PreDestory註解的方法,CommonAnnotationBeanPostProcessor繼承自該類,設置了destroyAnnotationType為PreDestroy.class)

file

 當按照第(二)部分第4步執行時,該類會按照如下順序執行銷毀動作:

file

  1. 如果beanPostProcessors列表不為空,則回調DestructionAwareBeanPostProcessor的postProcessBeforeDestruction方法,即執行@PreDestory註解方法

  2. 如果實現了DisposableBean,則回調DisposableBean的destroy方法,即執行DisposableBean介面方法

  3. 如果配置了destroy-method,則執行配置的方法,即執行destory-method配置方法

file

個人公眾號:啊駝