Spring框架支持六個作用域,其中四個只有在Web中才能用到,在此我們只說明前兩種作用域。 下麵是所有的六種作用域: ScopeDescription singleton (Default) Scopes a single bean definition to a single object in ...
Spring框架支持六個作用域,其中四個只有在Web中才能用到,在此我們只說明前兩種作用域。
下麵是所有的六種作用域:
Scope | Description |
---|---|
(Default) Scopes a single bean definition to a single object instance for each Spring IoC container. |
|
Scopes a single bean definition to any number of object instances. |
|
Scopes a single bean definition to the lifecycle of a single HTTP request. That is, each HTTP request has its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring . |
|
Scopes a single bean definition to the lifecycle of an HTTP . Only valid in the context of a web-aware Spring . |
|
Scopes a single bean definition to the lifecycle of a . Only valid in the context of a web-aware Spring . |
|
Scopes a single bean definition to the lifecycle of a . Only valid in the context of a web-aware Spring . |
這裡我們對前兩種singleton(單例)和prototype(原型進行學習)。
一、singleton
單例作用域是Spring框架的預設作用域。官方對它的說明是這樣的:
僅管理單例 Bean 的一個共用實例,並且所有對 ID 或 ID 與該 Bean 定義匹配的 Bean 的請求都會導致 Spring 容器返回該特定 Bean 實例。
換句話說,當你定義一個bean定義並且它的範圍是一個單例時,Spring IoC容器只創建由該bean定義定義的對象的一個實例。此單個實例存儲在此類單例 Bean 的緩存中,並且對該
命名 Bean 的所有後續請求和引用都將返回緩存的對象。下圖顯示了單例作用域的工作原理:
下麵是官方給出的單例的實例:
<bean id="accountService" class="com.something.DefaultAccountService"/> <!-- the following is equivalent, though redundant (singleton scope is the default) --> <bean id="accountService" class="com.something.DefaultAccountService" scope="singleton"/>
上面兩段代碼的效果是完全一樣的,由於預設是單例模式,所以scope="singleton"這樣顯性地展示出來並非必要的。
下麵我們對單例模式進行一個測試,看它是否是同一個對象的實例。
<bean id="student" class="com.jms.pojo.Student">
由此我們可以確認這是同一個實例。
二、prototype
Bean 部署的非單例原型範圍會導致每次對特定 Bean 發出請求時都會創建新的 Bean 實例。也就是說,將 Bean 註入到另一個 Bean 中,或者您通過容器上的方法調用來請求它。通常,應將原型作用域用於所有有狀態 Bean,將單例作用域用於無狀態 Bean。
下麵是官方給出的原型作用域的實例:
<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>
我們接下來對原型作用域進行測試:
<bean id="student" class="com.jms.pojo.Student" scope="prototype">
可以看到使用原型作用域後兩個對象不再是一個實例。
(本文僅作個人學習記錄用,如有紕漏敬請指正)