SpringBean的生命週期和作用域

首先,創建 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講--楊曉峯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章