Spring DestorySingleton流程

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

一.銷燬流程

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

file

 前面介紹過,DefaultSingletonBeanRegistry用一個Map緩存着全部的單例實例,對於對象的銷燬,只要簡單的將其從Map中移除就行。主要處理的是依賴關係下的bean銷燬順序以及回調接口的處理。上面先對disposableBeans中所涉及到的bean逐個進行銷燬,而後再清理全部的依賴關係和緩存的單例實例。ui

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

二.destroySingleton

file

 如上描述了該方法的大體過程,分別爲對象

  1. 將DefaultSingletonBeanRegistry中緩存的各類單例實例清除掉blog

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

  3. 刪除dependentBeanMap中beanName的內容,也是執行remove的方法,會返回依賴於beanName的其餘bean name列表,再依次調用destorySingleton銷燬這些bean接口

  4. 對當前的DisposableBean執行destoryrem

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

三.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

我的公衆號:啊駝

相關文章
相關標籤/搜索