詳解Spring中Bean的生命週期

  1. 實例化Bean:容器通過獲取BeanDefinition對象中的信息進行實例化。並且這一步僅僅是簡單的實例化,並未進行依賴注入。實例化對象被包裝在BeanWrapper對象中,BeanWrapper提供了設置對象屬性的接口,從而避免了使用反射機制設置屬性
  2. 設置對象屬性(依賴注入):實例化後的對象被封裝在BeanWrapper對象中,並且此時對象仍然是一個原生的狀態,並沒有進行依賴注入。緊接着,Spring根據BeanDefinition中的信息進行依賴注入。 並且通過BeanWrapper提供的設置屬性的接口完成依賴注入。
  3. 注入Aware接口:緊接着,Spring會檢測該對象是否實現了xxxAware接口(感知接口),讓bean感知到XXX,即讓bean知道自己在BeanFactory或ApplicationContext中的id以及在哪個工廠或==應用上下文==中(可以用這個方式來獲取其它Bean)。
  4. BeanPostProcessors前置處理:對創建結束後的bean對象進行增強(在使用前再進行一些自定義處理),就可以通過接口PostProcessor的postProcessBeforeInitialzation方法實現對bean的自定義處理(postProcessBeforeInitialzation( Object bean, String beanName ) 當前正在初始化的bean對象會被傳遞進來,我們就可以對這個bean作任何處理。 這個函數會先於InitialzationBean執行,因此稱爲前置處理。)所有Aware接口的注入就是在這一步完成的。
  5. InitializingBean與init-method當BeanPostProcessor的前置處理完成後就會進入本階段。 在bean完成了前置處理後Spring會檢查bean是否實現了InitializingBean接口,如果實現了該接口,就會執行afterPropertiesSet()方法,該方法可以爲bean增加自定義邏輯,==但它與前置處理不同,由於該函數並不會把當前bean對象傳進來,因此在這一步不能對bean進行增強,只能增加一些額外的邏輯。==實際過程中我們通過給bean的配置init-method屬性完成這一步。init-method本質上仍然使用了InitializingBean接口。
  6. BeanPostProcessors後置處理:在InitialzationBean完成後執行PostProcessor接口的postProcessAfterInitialzation( Object bean, String beanName )方法進行後置處理,完成執行完init-method後對bean對對象的增強 (作用與4一樣,只不過4是在Bean初始化前執行的,而這個是在Bean初始化後執行的)
  7. 被創建、注入、感知、增強並完成初始化後的Bean將一直駐留在應用上下文中給應用使用
  8. 如果bean實現了DisposableBean接口,將調用destroy方法。一般通過配置destroy-method配置在bean銷燬前執行指定的邏輯
  9. bean隨着應用上下文結束被銷燬
  • 工廠和應用上下文都可以進行bean的生命週期管理,二者的區別在於:
    • 實例化bean對象時 (1)對於BeanFactory容器,當客戶向容器請求一個尚未初始化的bean時,或初始化bean的時候需要注入另一個尚未初始化的依賴時,容器就會調用createBean()進行實例化。 (2)對於ApplicationContext容器,當容器啓動結束後,便實例化所有的bean。
    • 檢查Aware接口時,工廠只檢查BeanFacotryAware/BeanNameAware;應用上下文檢查BeanFacotryAware/BeanNameAware/ApplicationContextAware

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章