Spring Bean 生命周期之BeanFactory

???????? 在 Spring 中,可以從兩個方面來定義Bean的生命周期:(1)Bean 的作用域(2)實例化Bean 時所經歷的一系列階段,下面我們可以從 BeanFactory 與 ApplicationContext來分析 Bean 的生命周期。

先放上一張圖片,我們來看看 BeanFactory 中 Bean 完整的生命周期過程。

BeanFactory 中 Bean 生命周期

具體分析過程如下:

(1)如果容器實現了 org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor 接口(實際上最終是實現 BeanPostProcessor 接口),那么我們在 getBean( ) 向容器中請求得到某個Bean時,會先進入 postProcessBeforeInstantiation( ) 方法。作用: 執行Bean 的修改操作。

(2)根據配置情況,選擇使用 Bean 的構造函數或者工廠方法來實例化 Bean。

(3)接下來會執行到 InstantiationAwareBeanPostProcessor 接口中 postProcessAfterInstantiation( ) 方法,可以執行Bean的修改操作。

(4)如果我們在配置文件中設定了Bean的屬性信息,那么容器將執行InstantiationAwareBeanPostProcessor 接口中 postProcessPropertyValues( ) 方法,為設置每一個屬性做準備,注意:設置每一個屬性之前都會調用此方法。

(5)調用 Bean 的 setter 方法設置屬性值。

(6)給 Bean 設置在配置文件中設定好的名稱。方法是:實現 BeanFactoryAware 接口,利用 setBeanName( ) 方法設置。

(7)將 BeanFactory 實例設定到 Bean 中。方法是:實現 BeanFactoryAware 接口,利用 setBeanFactory( ) 方法設置。

(8)如果容器實現了 org.springframework.beans.factory.config.BeanPostProcessor 接口,那么將調用 BeanPostProcessor 中的 Object postProcessBeforeInitialization (Object bean,String beanName) 方法對 Bean 進行相關操作。其中 bean 為當前正在處理的 Bean,beanName為當前 Bean 配置名。我們可以通過 BeanPostProcessor 接口 實現對 Spring 的 AOP,動態代理等。

(9)如果 Bean 實現了 InitializingBean 接口,那么將調用 afterPropertiesSet() 方法。

(10)如果在配置文件中設定了 init-method 屬性,那么將會調用這個初始方法。

(11)調用 BeanPostProcessor 中的 Object postProcessAfterInitialization (Object bean,String beanName) 方法再次對 Bean 進行相關操作。

(12)如果將 Bean 的作用域設定為 singleton,那么容器會將 Bean 放入緩存池中,將 Bean 的引用返回給調用者,Spring 繼續負責這些 Bean 后續的生命周期管理;若作用域設定為 prototype那么Spring 不負責這些 Bean 后續的生命周期管理,直接將Bean返回給調用者,讓調用者負責管理。

(13)對于作用域設定為 singleton 的 Bean,當容器關閉時,將觸發Spring 對 Bean 后續的生命周期管理,如果 Spring 實現了 DisposableBean 接口,那么將執行接口的 destory( ) 方法,在這里可以編寫釋放資源,記錄日志等操作。

(14)如果我們指定了 Bean 的 destroy-method 方法,那么 Spring 將執行這個方法,完成釋放資源。

Spring 容器實例化 Bean ,調用 Bean ,以及銷毀 Bean 都涉及到了特定的方法,可以大致將這些方法分成四類。

(1)Bean 自身的方法:Bean 的構造函數實例化Bean,Setter 方法 設置屬性值,init-method與 destroy-method 方法 來初始化與銷毀 Bean。

(2)Bean 級生命周期接口方法:BeanFactoryAware,BeanNameAware,InitializingBean,DisposableBean,這些由Bean直接實現。

(3)容器級生命周期接口方法:InstantiationAwareBeanPostProcessor,BeanPostProcessor,可以將這兩個的實現類稱為“后處理器”。這些接口一般不由Bean直接實現,它們跟Bean是相互獨立的,是以插件的形式作用于Bean,默認情況下,是對全局的 Bean 產生影響。

(4)容器級工廠后處理器接口方法:包括AspectJWeavingEnable,CustomAutowireConfigurer,ConfigurationClassPostProcessor 等方法。在應用上下文裝配配置文件后立即調用。

Spring 可以注冊多個后處理器,只要同時實現 org.springframework.core.Ordered 接口,容器將會按照特定的順序依次調用這些后處理器。

下一章,我們將來講 Bean 生命周期實例,根據具體代碼來分析?BeanFactory 中 Bean 的生命周期,謝謝關注。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容