定義
Bean是一個被實例化,組裝,並通過Spring IOC容器(BeanFactory和ApplicationContext容器)所管理的對象。
作用域
Spring支持五個作用域,分別是singleton、prototype、request、session、global session
| 作用域 | 說明 |
| singleton | singleton 是默認的作用域,在spring IoC容器僅存在一個Bean實例,Bean以單例方式存在,在創建起容器時就同時自動創建了一個bean的對象 |
| prototype | 每次從容器中調用Bean時,都返回一個新的實例,即每次調用getBean()時,相當於執行newXxxBean()。Prototype是原型類型,它在我們創建容器的時候並沒有實例化,而是當我們獲取bean的時候才會去創建一個對象,而且我們每次獲取到的對象都不是同一個對象 |
| request | 每次HTTP請求都會創建一個新的Bean,該作用域僅適用於WebApplicationContext環境 |
| session | 同一個HTTP Session共享一個Bean,不同Session使用不同的Bean,僅適用於WebApplicationContext環境 |
| global-session |
一般用於Portlet應用環境,該運用域僅適用於WebApplicationContext環境 |
生命周期
Bean的生命周期可以表達為:Bean的實例化(定義)- Bean的初始化 - Bean的使用 - Bean的銷毀

1、實例化一個Bean--也就是我們常說的new;
2、按照Spring上下文對實例化的Bean進行配置(屬性注入)--也就是IOC注入;
3、如果這個Bean已經實現了BeanNameAware接口,會調用它實現的setBeanName(String)方法,此處傳遞的就是Spring配置文件中Bean的id值
4、如果這個Bean已經實現了BeanFactoryAware接口,會調用它實現的setBeanFactory(setBeanFactory(BeanFactory)傳遞的是Spring工廠自身(可以用這個方式來獲取其它Bean,只需在Spring配置文件中配置一個普通的Bean就可以);
5、如果這個Bean已經實現了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文(同樣這個方式也可以實現步驟4的內容,但比4更好,因為ApplicationContext是BeanFactory的子接口,有更多的實現方法);
6、如果這個Bean關聯了BeanPostProcessor接口,將會調用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor經常被用作是Bean內容的更改,並且由於這個是在Bean初始化結束時調用那個的方法,也可以被應用於內存或緩存技術;
7、如果Bean在Spring配置文件中配置了init-method屬性會自動調用其配置的初始化方法。
8、如果這個Bean關聯了BeanPostProcessor接口,將會調用postProcessAfterInitialization(Object obj, String s)方法、;
注:以上工作完成以后就可以應用這個Bean了,那這個Bean是一個Singleton的,所以一般情況下我們調用同一個id的Bean會是在內容地址相同的實例,當然在Spring配置文件中也可以配置非Singleton。
9、當Bean不再需要時,會經過清理階段,如果Bean實現了DisposableBean這個接口,會調用那個其實現的destroy()方法;
10、最后,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動調用其配置的銷毀方法。
