Spring Bean的生命週期

1.當調用者經過getBean(beanName)向容器請求某一個Bean時,若是容器註冊了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,在實例化Bean以前,將調用接口的postProcessBeforeInstantiation()方法;spring

2.根據配置狀況調用Bean構造函數或工廠方法實例化Bean;緩存

3.若是容器註冊了InstantiationAwareBeanPostProcessor接口,在實例化Bean以後,調用該接口的postProcessAfterInstantiation()方法,可在這裏對已經實例化的對象進行一些「梳妝打扮」;框架

4.若是Bean配置了屬性信息,容器在這一步着手將配置值設置到Bean對應的屬性中,不過在設置每一個屬性以前將先調用InstantiationAwareBeanPostProcess接口的postProcessPropertyValues()方法;函數

5.調用Bean的屬性設置方法設置屬性值;post

6.若是Bean實現了org.springframework.beans.factory.BeanNameAware接口,將調用setBeanName()接口方法,將配置文件中該Bean對應的名稱設置到Bean中;spa

7.若是Bean實現了org.springframework.beans.factory.BeanNameAware接口,將調用setBeanFactory()接口方法,將BeanFactory容器實例設置到Bean中;prototype

8.若是BeanFactory裝配了org.springframework.beans.factory.config.BeanPostProcessor後處理器,將調用BeanPostProcessor的Object PostProcessBeforeInitialization(Object bean,String beanName)接口方法對Bean進行加工操做。其中入參bean是當前正在處理的Bean,而beanName是當前Bean的配置名,返回的對象爲加工處理後的Bean。用戶可使用該方法對某些Bean進行特殊的處理,甚至改變Bean的行爲,BeanPostProcessor在Spring框架中佔有重要的地位,爲容器提供對Bean進行後續加工處理的切入點,Spring容器所提供的各類「神奇功能」(如AOP,動態代理等)都經過BeanPostProcessor實施;代理

9.若是Bean實現了InitializingBean的接口,將調用接口的afterPropertiesSet()方法;日誌

10.若是在<bean>經過init-method屬性定義了初始化方法,將執行這個方法;orm

11.BeanPostProcessor後處理器定義了兩個方法:其一是postProcessBeforeInitialization()在第8步調用;其二是Object postProcessAfterInitialization(Object bean,String beanName)方法,這個方法在此時調用,容器再次得到對Bean進行加工處理的機會;

12.若是<bean>中指定Bean的做用範圍爲scope=「prototype」,將Bean返回給調用者,調用者負責Bean後續生命的管理,Spring再也不管理這個Bean的生命週期。若是做用範圍設置爲scope=「Singleton」,則將Bean放入到SpringIoC容器的緩存池中,並將Bean引用返回給調用者,Spring繼續對這些Bean進行後續的生命管理;

13.對於scope=「singleton」的Bean,當容器關閉時,將觸發Spring對Bean的後續生命週期的管理工做,首先若是Bean實現了DisposableBean接口,則將調用接口的afterPropertiesSet()方法,能夠在此編寫釋放資源,記錄日誌等操做;

14.對於scope=「singleton」的Bean,若是經過<bean>的destroy-method屬性執行了Bean的銷燬方法,Spring將執行Bean的這個方法,完成Bean資源的釋放等操做。

    Bean的完整生命週期從Spring容器着手實例化Bean開始,直到最終銷燬Bean,這當中通過了許多關鍵點,各個關鍵點都涉及特定的方法調用,能夠將這些方法大體劃分爲三類:

        ①Bean自身的方法:如調用Bean構造函數實例化Bean,調用Setter設置Bean 的屬性值以及經過<bean>的 init-method所指定的方法;

        ②Bean級生命週期接口方法:如BeanNameAware、BeanFactoryAware、             InitializingBean和 DisposaleBean,這些接口方法由Bean類直接實現;

        ③容器級生命週期接口方法:由InstantiationAwareBeanPostProcessor和     BeanPostProcessor這兩個接口實 現的步驟,通常稱它們的實現類爲「後處理器」。後處理器接口通常不禁Bean自己實現,它們獨立於Bean, 實現類以容器附加裝置的形式註冊到Spring容器中並經過接口反射爲Spring容器預先識別。當Spring容器創 建任何Bean的時候,這些後處理器都會發生做用,因此這些後處理器的影響是全局性的。固然,用戶能夠 經過合理地編寫後處理器,讓其僅對感興趣的Bean進行加工處理。

     Bean級生命週期接口和容器級生命週期接口是個性和共性辯證統一思想的體現,前者解決Bean個性化處理的問題;然後者解決容器中某些Bean共性化處理的問題。

相關文章
相關標籤/搜索