1、singleton:單例模式,Spring IoC容器中只會存在一個共享的bean實例,而且全部對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一實例。web
<bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton">spring
2、prototype:原型模式,Prototype做用域的bean會致使在每次對該bean請求(將其注入到另外一個bean中,或者以程序的方式調用容器的getBean()方法)時都會建立一個新的bean實例。session
!!通常狀況,對有狀態的bean應該使用prototype做用域,而對無狀態的bean則應該使用singleton做用域。spa
!!prototype做用域Bean的建立、銷燬代價比較大。而singleton做用域的Bean實例一旦建立成功,能夠重複使用。所以,除非必要,不然儘可能避免將Bean被設置成prototype做用域。prototype
3、request:每次HTTP請求將會有各自的bean實例,它們依據某個bean定義建立而成。該做用域僅在基於web的Spring ApplicationContext情形下有效。orm
4、session:在一個HTTP Session中,一個bean定義對應一個實例。該做用域僅在基於web的Spring ApplicationContext情形下有效。生命週期
!!request、session做用域的Bean只對Web應用才真正有效。實際上一般只會將Web應用的控制器Bean才指定成request做用域作用域
5、global session:在一個全局的HTTP Session中,一個bean定義對應一個實例。典型狀況下,僅在使用portlet context的時候有效。該做用域僅在基於web的Spring ApplicationContext情形下有效。get
考慮下面bean定義:原型
<bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/>
global session做用域相似於標準的HTTP Session做用域,不過它僅僅在基於portlet的web應用中才有意義。Portlet規範定義了全局Session的概念,它被全部構成某個portlet web應用的各類不一樣的portlet所共享。在global session做用域中定義的bean被限定於全局portlet Session的生命週期範圍內。
!!假如你在編寫一個標準的基於Servlet的web應用,而且定義了一個或多個具備global session做用域的bean,系統會使用標準的HTTP Session做用域,而且不會引發任何錯誤。
* spring 還支持自定義做用域。