在Spring中,那些組成應用程序的主體以及由Spring IoC容器所管理的對象,被稱之爲Bean。Bean與應用程序中其餘對象(好比本身建立類)的區別就是,Bean是由IoC容器建立於銷燬的。在Spring中,每次從BeanFactory或ApplicationContext指定病獲取Bean時都會產生一個新的實例,且默認都是單例。web
Spring Bean生命週期比較複雜,能夠分爲建立和銷燬建立緩存
1.實例化Bean對象session
2.設置Bean屬性post
Bean實例生命週期的知性過程以下:spa
* Spring實例化一個bean,就是newprototype
* Spring會在配置說明,也就是IoC注入對象
* 若是這個Bean已經實現了Aware接口,會調用它實現setBeanName方法,次數傳遞的就是Spring配置中Bean的id值接口
* 若是這個Bean已經實現了BeanFactoryAware接口,會調用它實現的setBeanFactory(setBeanFactory(BeanFactory)傳遞的是Spring工廠自身(能夠用這個方式來獲取其它Bean,只需在Spring配置文件中配置一個普通的Bean就能夠);生命週期
* 若是這個Bean已經實現了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文(一樣這個方式也能夠實現步驟4的內容,但比4更好,由於ApplicationContext是BeanFactory的子接口,有更多的實現方法);內存
* 若是這個Bean關聯了BeanPostProcessor接口,將會調用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor常常被用做是Bean內容的更改,而且因爲這個是在Bean初始化結束時調用那個的方法,也能夠被應用於內存或緩存技術;
* 若是Bean在Spring配置文件中配置了init-method屬性會自動調用其配置的初始化方法。
* 若是這個Bean關聯了BeanPostProcessor接口,將會調用postProcessAfterInitialization(Object obj, String s)方法、;
注:以上工做完成之後就能夠應用這個Bean了,那這個Bean是一個Singleton的,因此通常狀況下咱們調用同一個id的Bean會是在內容地址相同的實例,固然在Spring配置文件中也能夠配置非Singleton,這裏咱們不作贅述。
* Bean再也不須要時,會通過清理階段,若是Bean實現了DisposableBean這個接口,會調用那個其實現的destroy()方法;
* 最後,若是這個Bean的Spring配置中配置了destroy-method屬性,會自動調用其配置的銷燬方法。
Spring Bean的銷燬過程調用了DisposableBean的destory方法和Bean自身定製的destory方法。
Spring Bean有5個做用域
Singleton,Spring的默認做用域,也就是爲每一個IoC容器建立惟一的一個Bean實例。適合無狀態的Bean
Prototype,針對每一個getBean請求,容器都會單首創建一個Bean實例。適合有狀態的Bean,至關於new xxBean()
Request,爲每一個HTTP請求建立單獨的Bean實例,適用於WebApplicationContext 環境
Session,同一個Http Session才能共享一個Bean,適用於WebApplicationContext 環境
GlobalSession,用於Portlet容器,由於每一個Portlet有單獨的Session,GlobalSession提供一個全局性的Http Session,適用於WebApplicationContext 環境
關於Spring Bean做用域再作補充
1.Spring中的bean默認都單例Singleton(bean的Id惟一),就是說容器在建立一個bean對象後,無論是使用與否,它都切實的存在,每次獲取到的對象都是同一個對象。注意,Singleton做用域是Spring中卻省的做用域。
<bean name="userService" class="service.UserService" scope="singleton"></bean>
2.當一個bean的做用域爲Prototype時,表示這個bean定義對應了多個對象實例,每次getBean()時,都會建立一個新的bean實例。Prototype,在咱們建立容器的時候並無實例化,而是咱們獲取bean的時候纔回去建立一個對象,每次獲取的對象不同。
<bean name="userService" class="service.UserService" scope="prototype"></bean>
3.每次HTTP請求,Spring容器會根據loginActionbean定義建立一個全新的LoginAction,此僅在當前HTTP Request內有效,而HTTP時無常態的,因此每次的請求,都是心的bean實例,當請求結束,request做用域的bean實例被銷燬。
<bean name="userService" class="service.UserService" scope="request"></bean>
4.定義爲Session,該做用域僅在基於web的Spring ApplicationContext情形下有效。能夠根據須要任意的更改bean的狀態。
<bean name="userService" class="service.UserService" scope="session"></bean>
5.Global Session,表示了一個全局的HTTP Session,僅限於全局portlet context的生命週期範圍內。
<bean name="userService" class="service.UserService" scope="globalSession"></bean>
Spring Bean的生命週期,徹底被容器所管理,從屬性設置到各類依賴關係,都是容器負責注入,並進行各個階段其餘事宜的處理,Spring容器爲應用開發者定義了清晰的生命週期溝通界面。