緊接著,spring會檢測該物件是否實現了***aware介面,並將相關的***aware例項注入給bean。
ps:什麼是aware介面?
容器管理的bean一般不需要了解容器的狀態和直接使用容器,但是在某些情況下,是需要在bean中直接對ioc容器進行操作的,這時候,就需要在bean中設定對容器的感知。spring ioc容器也提供了該功能,它是通過特定的aware介面來完成的。
當經過上述幾個步驟後,bean物件已經被正確構造,但如果你想要物件被使用前再進行一些自定義的處理,就可以通過beanpostprocessor介面實現。
該介面提供了兩個函式:
postprocessbeforeinitialzation( object bean, string beanname )
當前正在初始化的bean物件會被傳遞進來,我們就可以對這個bean作任何處理。
這個函式會先於initialzationbean執行,因此稱為前置處理。
所有aware介面的注入就是在這一步完成的。
postprocessafterinitialzation( object bean, string beanname )
當前正在初始化的bean物件會被傳遞進來,我們就可以對這個bean作任何處理。
這個函式會在initialzationbean完成後執行,因此稱為後置處理。
當beanpostprocessor的前置處理完成後就會進入本階段。
initializingbean介面只有乙個函式: afterpropertiesset()
這一階段也可以在bean正式構造完成前增加我們自定義的邏輯,但它與前置處理不同,由於該函式並不會把當前bean物件傳進來,因此在這一步沒辦法處理物件本身,只能增加一些額外的邏輯。
若要使用它,我們需要讓bean實現該介面,並把要增加的邏輯寫在該函式中。然後spring會在前置處理完成後檢測當前bean是否實現了該介面,並執行afterpropertiesset函式。
當然,spring為了降低對客戶**的侵入性,給bean的配置提供了init-method屬性,該屬性指定了在這一階段需要執行的函式名。spring便會在初始化階段執行我們設定的函式。init-method本質上仍然使用了initializingbean介面。
參考:
1:spring為bean提供了兩種初始化bean的方式,實現initializingbean介面,實現afterpropertiesset方法,或者在配置檔案中同過init-method指定,兩種方式可以同時使用
2:實現initializingbean介面是直接呼叫afterpropertiesset方法,比通過反射呼叫init-method指定的方法效率相對來說要高點。但是init-method方式消除了對spring的依賴
3:如果呼叫afterpropertiesset方法時出錯,則不呼叫init-method指定的方法。
和init-method一樣,通過給destroy-method指定函式,就可以在bean銷毀前執行指定的邏輯。
Spring Bean生命週期
1.容器尋找bean的定義資訊並且將其實例化。2.受用依賴注入,spring按照bean定義資訊配置bean的所有屬性。3.如果bean實現了beannameaware介面,工廠呼叫bean的setbeanname 方法傳遞bean的id。4.如果bean實現了beanfactoryaware介面,...
spring bean生命週期
生命週期 定義,初始化,使用,銷毀 一.初始化 方法1.實現org.springframework.beans.foctory.initializingbean介面,覆蓋afterpropertiesset方法。系統會自動查詢afterpropertiesset方法,執行其中的初始化操作 方法2.配...
Springbean生命週期
springbean的完整生命週期大致如下 1 首先例項化 beanfactorypostprocessor的實現類,執行它的postprocessorbeanfactory方法 2 例項化beanpostprocessor 的實現類 3 例項化 instantiationawarebeanpost...