回覆列表
  • 1 # 使用者565585011300

    對於普通的Java物件,當new的時候建立物件,當它沒有任何引用的時候被垃圾回收機制回收。而由Spring IoC容器託管的物件,它們的生命週期完全由容器控制。Spring中每個Bean的生命週期如下:

    1. 例項化Bean

    對於BeanFactory容器,當客戶向容器請求一個尚未初始化的bean時,或初始化bean的時候需要注入另一個尚未初始化的依賴時,容器就會呼叫createBean進行例項化。 對於ApplicationContext容器,當容器啟動結束後,便例項化所有的bean。 容器透過獲取BeanDefinition物件中的資訊進行例項化。並且這一步僅僅是簡單的例項化,並未進行依賴注入。 例項化物件被包裝在BeanWrapper物件中,BeanWrapper提供了設定物件屬性的介面,從而避免了使用反射機制設定屬性。

    2. 設定物件屬性(依賴注入)

    例項化後的物件被封裝在BeanWrapper物件中,並且此時物件仍然是一個原生的狀態,並沒有進行依賴注入。 緊接著,Spring根據BeanDefinition中的資訊進行依賴注入。 並且透過BeanWrapper提供的設定屬性的介面完成依賴注入。

    3. 注入Aware介面

    緊接著,Spring會檢測該物件是否實現了xxxAware介面,並將相關的xxxAware例項注入給bean。

    4. BeanPostProcessor

    當經過上述幾個步驟後,bean物件已經被正確構造,但如果你想要物件被使用前再進行一些自定義的處理,就可以透過BeanPostProcessor介面實現。 該介面提供了兩個函式:

    postProcessBeforeInitialzation( Object bean, String beanName ) 當前正在初始化的bean物件會被傳遞進來,我們就可以對這個bean作任何處理。 這個函式會先於InitialzationBean執行,因此稱為前置處理。 所有Aware介面的注入就是在這一步完成的。postProcessAfterInitialzation( Object bean, String beanName ) 當前正在初始化的bean物件會被傳遞進來,我們就可以對這個bean作任何處理。 這個函式會在InitialzationBean完成後執行,因此稱為後置處理。

    5. InitializingBean與init-method

    當BeanPostProcessor的前置處理完成後就會進入本階段。 InitializingBean介面只有一個函式:

    afterPropertiesSet()

    這一階段也可以在bean正式構造完成前增加我們自定義的邏輯,但它與前置處理不同,由於該函式並不會把當前bean物件傳進來,因此在這一步沒辦法處理物件本身,只能增加一些額外的邏輯。 若要使用它,我們需要讓bean實現該介面,並把要增加的邏輯寫在該函式中。然後Spring會在前置處理完成後檢測當前bean是否實現了該介面,並執行afterPropertiesSet函式。

    當然,Spring為了降低對客戶程式碼的侵入性,給bean的配置提供了init-method屬性,該屬性指定了在這一階段需要執行的函式名。Spring便會在初始化階段執行我們設定的函式。init-method本質上仍然使用了InitializingBean介面。

    6. DisposableBean和destroy-method

    和init-method一樣,透過給destroy-method指定函式,就可以在bean銷燬前執行指定的邏輯。

  • 中秋節和大豐收的關聯?
  • 智慧氣象的具體表現是什麼?