-
1 # 使用者6494371215164
-
2 # 使用者1844319796352
Spring框架中,一旦把一個bean納入到Spring IoC容器之中,這個bean的生命週期就會交由容器進行管理,一般擔當管理者角色的是BeanFactory或ApplicationContext。認識一下Bean的生命週期活動,對更好的利用它有很大的幫助。
下面以BeanFactory為例,說明一個Bean的生命週期活動:
Bean的建立
由BeanFactory讀取Bean定義檔案,並生成各個例項。
Setter注入
執行Bean的屬性依賴注入。
BeanNameAware的setBeanName()
如果Bean類實現了org.springframework.beans.factory.BeanNameAware介面,則執行其setBeanName()方法。
BeanFactoryAware的setBeanFactory()
如果Bean類實現了org.springframework.beans.factory.BeanFactoryAware介面,則執行其setBeanFactory()方法。
BeanPostProcessors的processBeforeInitialization()
容器中如果有實現org.springframework.beans.factory.BeanPostProcessors介面的例項,則任何Bean在初始化之前都會執行這個例項的processBeforeInitialization()方法。
InitializingBean的afterPropertiesSet()
如果Bean類實現了org.springframework.beans.factory.InitializingBean介面,則執行其afterPropertiesSet()方法。
Bean定義檔案中定義init-method
在Bean定義檔案中使用“init-method”屬性設定方法名稱,如下:
.......
這時會執行initMethod()方法,注意,這個方法是不帶引數的。
BeanPostProcessors的processAfterInitialization()
容器中如果有實現org.springframework.beans.factory.BeanPostProcessors介面的例項,則任何Bean在初始化之前都會執行這個例項的processAfterInitialization()方法。
DisposableBean的destroy()
在容器關閉時,如果Bean類實現了org.springframework.beans.factory.DisposableBean介面,則執行它的destroy()方法。
Bean定義檔案中定義destroy-method
在容器關閉時,可以在Bean定義檔案中使用“destory-method”定義的方法
.......
這時會執行destroyMethod()方法,注意,這個方法是不帶引數的。
以上就是BeanFactory維護的一個Bean的生命週期。下面這個圖可能更直觀一些:
如果使用ApplicationContext來維護一個Bean的生命週期,則基本上與上邊的流程相同,只不過在執行BeanNameAware的setBeanName()後,若有Bean類實現了org.springframework.context.ApplicationContextAware介面,則執行其setApplicationContext()方法,然後再進行BeanPostProcessors的processBeforeInitialization()
實際上,ApplicationContext除了向BeanFactory那樣維護容器外,還提供了更加豐富的框架功能,如Bean的訊息,事件處理機制等。
回覆列表
Spring中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實戰