在spring2.0以前bean只有2種做用域即:singleton(單例)、non-singleton(也稱prototype), Spring2.0之後,增長了session、request、global session三種專用於Web應用程序上下文的Bean。所以,默認狀況下Spring2.0如今有五種類型的Bean。固然,Spring2.0對Bean的類型的設計進行了重構,並設計出靈活的Bean類型支持,理論上能夠有無數多種類型的Bean,用戶能夠根據本身的須要,增長新的Bean類型,知足實際應用需求。java
如何使用spring的做用域:
web
<bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>
這裏的scope就是用來配置spring bean的做用域,它標識bean的做用域。 spring
一、singleton做用域 設計模式
當一個bean的做用域設置爲singleton, 那麼Spring IOC容器中只會存在一個共享的bean實例,而且全部對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一實例。換言之,當把一個bean定義設置爲singleton做用域時,Spring IOC容器只會建立該bean定義的惟一實例。這個單一實例會被存儲到單例緩存(singleton cache)中,而且全部針對該bean的後續請求和引用都將返回被緩存的對象實例,這裏要注意的是singleton做用域和GOF設計模式中的單例是徹底不一樣的,單例設計模式表示一個ClassLoader中只有一個class存在,而這裏的singleton則表示一個容器對應一個bean,也就是說當一個bean被標識爲singleton時候,spring的IOC容器中只會存在一個該bean。<bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>
或者
<bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/>
二、prototype
<bean id="role" class="spring.chapter2.maryGame.Role" scope="prototype"/>
或者
<beanid="role" class="spring.chapter2.maryGame.Role" singleton="false"/>三、request
<web-app> ... <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> ... </web-app>,若是是Servlet2.4之前的web容器,那麼你要使用一個javax.servlet.Filter的實現:
<web-app> .. <filter> <filter-name>requestContextFilter</filter-name> <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class> </filter> <filter-mapping> <filter-name>requestContextFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ... </web-app>接着既能夠配置bean的做用域了:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="request"/>
四、session
<bean id="role" class="spring.chapter2.maryGame.Role" scope="session"/>五、global session
<bean id="role" class="spring.chapter2.maryGame.Role" scope="global session"/>六、自定義bean裝配做用域
咱們創建一個線程的scope,該scope在表示一個線程中有效,代碼以下:緩存
import java.util.HashMap; import java.util.Map; import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.config.Scope; public class MyScope implements Scope { private final ThreadLocal<Object> threadScope = new ThreadLocal<Object>() { protected Object initialValue() { return new HashMap<String, Object>(); } }; public Object get(String name, ObjectFactory<?> objectFactory) { Map<String, Object> scope = (Map<String, Object>) threadScope.get(); Object object = scope.get(name); if (object == null) { object = objectFactory.getObject(); scope.put(name, object); } return object; } public Object remove(String name) { Map<String, Object> scope = (Map<String, Object>) threadScope.get(); return scope.remove(name); } public String getConversationId() { return null; } public Object resolveContextualObject(String key) { return null; } public void registerDestructionCallback(String name, Runnable callback) { } }