聲明容器中的對象的生命週期。當對象在Spring容器中組裝生成以後,由scope負責該對象在容器中的讀取和銷燬操做。html
Spring Framework支持五種做用域。 最初提供了兩種類型: singleton和prototype。在2.0後引入了三種只能在web應用的ApplicationContext中使用的類型: request, session, global session。理論上,Spring 2.0支持無數多種類型bean,用戶可根據本身的須要,增長新的bean類型。java
默認是singleton。web
在Spring IOC容器中,只存在一個共享的bean實例。這個單一實例被存儲在單例緩存(Singleton Cache)中,對於全部針對該bean的後續請求和引用,只要ID和定義相匹配,就返回同一實例。spring
區分:設計模式
單例設計模式表示一個ClassLoader中只有一個class存在,而這裏的singleton做用域表示一個容器中只存在一個bean。緩存
對該類對象的每個請求,都會產生一個新的BEAN實例,至關於一個new操做。安全
特殊的一點是, Spring容器沒法對prototype bean的整個生命週期負責,容器在初始化、配置、裝配完一個prototype實例後,將它交給調用者,就再也不管它了,任何配置好的析構生命週期回調方法都不會被調用。清除prototype對象並釋放持有的資源,都由調用者負責。session
對於其餘做用域,容器會調用全部對象的初始化生命週期回調方法。ssh
針對每一次HTTP請求,都會產生一個新的BEAN,同時該BEAN僅在當前HTTP request內有效。性能
注意!!request、session、global session使用的時候首先要在初始化web的web.xml中作以下配置:
若是你使用的是Servlet 2.4及以上的web容器,那麼你僅須要在web應用的XML聲明文件web.xml中增長下述ContextListener便可。若是是Servlet2.4之前的web容器,那麼你要使用一個javax.servlet.Filter的實現,這裏略。
session做用域表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP session內有效。
相似於標準的HTTP Session做用域,不過它僅僅在基於portlet的web應用中才有意義。Portlet規範定義了全局Session的概念,它被全部構成某個 portlet web應用的各類不一樣的portlet所共享。在global session做用域中定義的bean被限定於全局portlet Session的生命週期範圍內。若是你在web中使用global session做用域來標識bean,那麼web會自動當成session類型來使用。
默認狀況下,從bean工廠所取得的實例爲Singleton。單態模式的bean由IOC容器管理,非線程安全。
有狀態的bean都使用Prototype做用域,而對無狀態的bean則應該使用singleton做用域。
若是你但願容器裏的某個bean擁有其中某種新的web做用域,除了在bean級上配置相應的scope屬性,還必須在容器級作一個額外的初始化配置。即在web應用的web.xml中增長一個ContextListener。
在ssh2 項目中 , struts2的action交由spring管理的時候 ,spring默認是singleton的 ,而struts2的action顯然是有狀態的 ,因此必須顯示設置爲 scope=「prototype」。prototype爲原型模式 , 每次action請求過來都會建立一個action。
對那些Dao的實現類推薦scope=「singleton」 ,由於這些類沒有狀態,用singleton只需維護一個實例,顯然性能高一些。
<Spring 解密>