首先,創建 Bean 會經過一系列的步驟,主要包括:
- 實例化 Bean 對象。
- 設置Bean屬性。
- 如果我們通過各種 Aware 接口聲明瞭依賴關係,則會注入 Bean 對容器基礎設施層面的依賴。具體包括 `BeanNameAware`、`BeanFactoryAware` 和 `ApplicationContextAware`,分別會注入 `Bean ID`、`Bean Factory` 或者 `ApplicationContext`。
- 調用 `BeanPostProcessor` 的前置初始化方法 `postProcessBeforeInitialization`。
- 如果實現了 `InitializingBean` 接口,則會調用 `afterPropertiesSet` 方法。
- 調用 Bean 自身定義的 init 方法。
- 調用 `BeanPostProcessor` 的後置初始化方法 `postProcessAfterInitialization`。
其次,Spring Bean 的銷燬過程會依次調用 DisposableBean 的 destroy 方法和 Bean 自身定製的 destroy 方法。
Spring Bean 有五個作用域,其中最基礎的有下面兩種:
- Singleton,這是 Spring 的默認作用域,也就是爲每個 IOC 容器創建唯一的一個 Bean 實例。
- Prototype,針對每個 getBean 請求,容器都會單獨創建一個 Bean 實例。
從 Bean 的特點來看,Prototype 適合有狀態的 Bean,而 Singleton 則更適合無狀態的情況。另外,使用 Prototype 作用域需要經過仔細思考,畢竟頻繁創建和銷燬 Bean 是有明顯開銷的。
如果是 Web 容器,則支持另外三種作用域:
- Request,爲每個 HTTP 請求創建單獨的 Bean 實例。
- Session,很顯然 Bean 實例的作用域是 Session 範圍。
- GlobalSession,用於 Portlet 容器,因爲每個 Portlet 有單獨的 Session,GlobalSession 提供一個全局性的 HTTP Session。
摘自 極客時間--Java核心技術36講--楊曉峯