Bean 的作用域
當在 Spring 中定義一個 bean 時,你必須聲明該 bean 的作用域的選項。
Spring 框架支持以下五個作用域,分別爲singleton、prototype、request、session和global session,5種作用域說明如下所示,
作用域 | 描述 |
---|---|
singleton |
在spring IoC容器僅存在一個Bean實例,Bean以單例方式存在,默認值 |
prototype | 每次從容器中調用Bean時,都返回一個新的實例,即每次調用getBean()時,相當於執行newXxxBean() |
request | 每次HTTP請求都會創建一個新的Bean,該作用域僅適用於WebApplicationContext環境 |
session | 同一個HTTP Session共享一個Bean,不同Session使用不同的Bean,僅適用於WebApplicationContext環境 |
global-session | 一般用於Portlet應用環境,該運用域僅適用於WebApplicationContext環境 |
舉個栗子:
<!-- A bean definition with *** -->
<bean id="..." class="..." scope="">
<!-- collaborators and configuration for this bean go here -->
</bean>
singleton 作用域:
singleton 是默認的作用域,也就是說,當定義 Bean 時,如果沒有指定作用域配置項,則 Bean 的作用域被默認爲 singleton。
當一個bean的作用域爲Singleton,那麼Spring IoC容器中只會存在一個共享的bean實例,並且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一實例。
也就是說,當將一個bean定義設置爲singleton作用域的時候,Spring IoC容器只會創建該bean定義的唯一實例。
prototype 作用域
當一個bean的作用域爲Prototype,表示一個bean定義對應多個對象實例。Prototype作用域的bean會導致在每次對該bean請求(將其注入到另一個bean中,或者以程序的方式調用容器的getBean()方法)時都會創建一個新的bean實例。Prototype是原型類型,它在我們創建容器的時候並沒有實例化,而是當我們獲取bean的時候纔會去創建一個對象,而且我們每次獲取到的對象都不是同一個對象。根據經驗,對有狀態的bean應該使用prototype作用域,而對無狀態的bean則應該使用singleton作用域。