第一節介紹Spring啓動(連接)時,介紹AbstractApplicationContext的過銷燬過程,主要是調用了內部的destroyBeans方法,這節便來介紹bean的銷燬過程。緩存
destroyBeans方法內部委託給了DefaultSingletonBeanRegistry的destroySingletons方法。destroySingletons方法以下,比較清晰:post
前面介紹過,DefaultSingletonBeanRegistry用一個Map緩存着全部的單例實例,對於對象的銷燬,只要簡單的將其從Map中移除就行。主要處理的是依賴關係下的bean銷燬順序以及回調接口的處理。上面先對disposableBeans中所涉及到的bean逐個進行銷燬,而後再清理全部的依賴關係和緩存的單例實例。ui
上一節提到,disposableBeans中存放的是存在銷燬時須要進行方法回調的DisposableBeanAdapter對象,key爲對應的bean name,會在bean初始化後進行判斷而且存入。這裏會優先處理這些bean的銷燬,下面重點介紹下destroySingleton方法。3d
如上描述了該方法的大體過程,分別爲對象
將DefaultSingletonBeanRegistry中緩存的各類單例實例清除掉blog
執行disposableBeans.remove方法,移除該beanName,這裏會返回一個DisposableBean對象繼承
刪除dependentBeanMap中beanName的內容,也是執行remove的方法,會返回依賴於beanName的其餘bean name列表,再依次調用destorySingleton銷燬這些bean接口
對當前的DisposableBean執行destoryrem
刪除containedBeanMap中beanName的內容,執行的remove方法,hi返回beanName依賴的其餘bean name列表,再依次調用destorySingleton銷燬這些bean 從而具體的回調發生在第4步,開頭提到,bean在實例化後會以DisposableBeanAdapter存放進disposableBeans中,從而該類實現了具體的回調過程。get
DisposableBeanAdapter的結構以下,其實現了DisposableBean接口,於是能夠如上面說的,在destroySingleton方法進行回調。它在構造方法中對幾個重要的屬性進行了賦值,用於存儲銷燬動做相關的信息,包括:
Bean:待銷燬bean對象
beanName:待銷燬bean的beanName
destroyMethodName:待銷燬要調用的方法,該方法來源於destory-method配置項,若是爲(inferred),則會將回調方法賦值爲close或者shutdown
destoryMethod:destoryMethodName對應的Method對象
當按照第(二)部分第4步執行時,該類會按照以下順序執行銷燬動做:
若是beanPostProcessors列表不爲空,則回調DestructionAwareBeanPostProcessor的postProcessBeforeDestruction方法,即執行@PreDestory註解方法
若是實現了DisposableBean,則回調DisposableBean的destroy方法,即執行DisposableBean接口方法
若是配置了destroy-method,則執行配置的方法,即執行destory-method配置方法
我的公衆號:啊駝