生活随笔
收集整理的這篇文章主要介紹了
Spring中Bean的生命周期是怎样的
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
于普通的Java對象,當new的時候創建對象,當它沒有任何引用的時候被垃圾回收機制回收。而由Spring IoC容器托管的對象,它們的生命周期完全由容器控制。Spring中每個Bean的生命周期如下:
實例化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銷毀前執行指定的邏輯。中Bean生命周期過程:1.Spring對Bean進行實例化(相當于程序中的new Xx())2.Spring將值和Bean的引用注入進Bean對應的屬性中3.如果Bean實現了BeanNameAware接口,Spring將Bean的ID傳遞給setBeanName()方法(實現BeanNameAware清主要是為了通過Bean的引用來獲得Bean的ID,一般業務中是很少有用到Bean的ID的)4.如果Bean實現了BeanFactoryAware接口,Spring將調用setBeanDactory(BeanFactory bf)方法并把BeanFactory容器實例作為參數傳入。(實現BeanFactoryAware 主要目的是為了獲取Spring容器,如Bean通過Spring容器發布事件等)5.如果Bean實現了ApplicationContextAwaer接口,Spring容器將調用setApplicationContext(ApplicationContext ctx)方法,把y應用上下文作為參數傳入.(作用與BeanFactory類似都是為了獲取Spring容器,不同的是Spring容器在調用setApplicationContext方法時會把它自己作為setApplicationContext 的參數傳入,而Spring容器在調用setBeanDactory前需要程序員自己指定(注入)setBeanDactory里的參數BeanFactory )6.如果Bean實現了BeanPostProcess接口,Spring將調用它們的postProcessBeforeInitialization(預初始化)方法(作用是在Bean實例創建成功后對進行增強處理,如對Bean進行修改,增加某個功能)7.如果Bean實現了InitializingBean接口,Spring將調用它們的afterPropertiesSet方法,作用與在配置文件中對Bean使用init-method聲明初始化的作用一樣,都是在Bean的全部屬性設置成功后執行的初始化方法。8.如果Bean實現了BeanPostProcess接口,Spring將調用它們的postProcessAfterInitialization(后初始化)方法(作用與6的一樣,只不過6是在Bean初始化前執行的,而這個是在Bean初始化后執行的,時機不同 )9.經過以上的工作后,Bean將一直駐留在應用上下文中給應用使用,直到應用上下文被銷毀10.如果Bean實現了DispostbleBean接口,Spring將調用它的destory方法,作用與在配置文件中對Bean使用destory-method屬性的作用一樣,都是在Bean實例銷毀前執行的方法。
總結
以上是生活随笔為你收集整理的Spring中Bean的生命周期是怎样的的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。