spring bean的做用域

1singleton:單例模式,Spring IoC容器中只會存在一個共享的bean實例,而且全部對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一實例。web

<bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton">spring

2prototype原型模式,Prototype做用域的bean會致使在每次對該bean請求(將其注入到另外一個bean中,或者以程序的方式調用容器的getBean()方法)時都會建立一個新的bean實例。session

!!通常狀況,對有狀態的bean應該使用prototype做用域,而對無狀態的bean則應該使用singleton做用域。spa

!!prototype做用域Bean的建立、銷燬代價比較大。而singleton做用域的Bean實例一旦建立成功,能夠重複使用。所以,除非必要,不然儘可能避免將Bean被設置成prototype做用域。prototype

3request每次HTTP請求將會有各自的bean實例,它們依據某個bean定義建立而成。該做用域僅在基於webSpring ApplicationContext情形下有效。orm

4session在一個HTTP Session中,一個bean定義對應一個實例。該做用域僅在基於webSpring ApplicationContext情形下有效。生命週期

!!request、session做用域的Bean只對Web應用才真正有效。實際上一般只會將Web應用的控制器Bean才指定成request做用域作用域

5global session在一個全局的HTTP Session中,一個bean定義對應一個實例。典型狀況下,僅在使用portlet context的時候有效。該做用域僅在基於webSpring ApplicationContext情形下有效。get

考慮下面bean定義:原型

<bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/>

global session做用域相似於標準的HTTP Session做用域,不過它僅僅在基於portletweb應用中才有意義。Portlet規範定義了全局Session的概念,它被全部構成某個portlet web應用的各類不一樣的portlet所共享。在global session做用域中定義的bean被限定於全局portlet Session的生命週期範圍內。

!!假如你在編寫一個標準的基於Servletweb應用,而且定義了一個或多個具備global session做用域的bean,系統會使用標準的HTTP Session做用域,而且不會引發任何錯誤。

* spring 還支持自定義做用域。
相關文章
相關標籤/搜索