Bean的作用域
參考:spring FrameWork官方文檔
spring4.x中官方有7中作用域,如果使用的是applicationContext作為容器的話就只用5中作用域
下面的其中作用域為
下面講解平常使用applicationContext作為容器的中為5中作用域摔握,分別為singleton(單例)祸憋、prototype(原型)贱勃、request、session和global session,5種作用域說明如下:
singleton:單例模式屈张,Spring IoC容器中只會存在一個共享的Bean實例剩胁,無論有多少個Bean引用它诉植,始終指向同一對象。Singleton作用域是Spring中的缺省作用域昵观,也可以顯示的將Bean定義為singleton模式
單例模式
prototype:原型模式晾腔,每次通過Spring容器獲取prototype定義的bean時,容器都將創(chuàng)建一個新的Bean實例啊犬,每個Bean實例都有自己的屬性和狀態(tài)灼擂,而singleton全局只有一個對象。根據(jù)經(jīng)驗觉至,對有狀態(tài)的bean使用prototype作用域剔应,而對無狀態(tài)的bean使用singleton作用域。
原型
request,session,globalSession,application, 和websocket這幾種作用域使用的范圍 web-aware Spring中ApplicationContext接口(例如XmlWebApplicationContext).有效。
在使用下面幾種方式的時候峻贮,需要注意的是除了需要在設(shè)置bean的scope席怪,還需要根據(jù)servlet容器不同來考慮。如果使用了Spring Web MVC 中Spring DispatcherServletor DispatcherPortlet,已經(jīng)設(shè)置好了相應(yīng)的作用域纤控,如果是使用的 Servlet 2.5 web 容器請求不是使Spring的DispatcherServlet(例如使用, JSF或者 Struts)挂捻,需要注冊到監(jiān)聽器中。如果是servlet3.0需要通WebApplicationInitializer接口編程實現(xiàn)船万。當(dāng)然如果更老的容器添加如下配置到web.xml申明使用刻撒。
<web-app>
...
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
...
</web-app>
或者如果使用監(jiān)聽設(shè)置有問題的話也可以使用過濾Spring’s RequestContextFilter, spring的過濾。這個過濾器的映射和你的配置有關(guān)耿导,必要的時候需要做一定的調(diào)整声怔。配置:
<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>
- DispatcherServlet, RequestContextListener, 和RequestContextFilter 準(zhǔn)確的說所做的事相同,換句話說就是綁定HTTP請求對象到要為該請求服務(wù)的線程中去 碎节。這樣創(chuàng)建的
bean就是 request- 和session-scoped的作用域捧搞, 提供下一步調(diào)用鏈。
- 下面幾種作用域提供兩種配置
request:在一次Http請求中狮荔,容器會返回該Bean的同一實例胎撇。而對不同的Http請求則會產(chǎn)生新的Bean,而且該bean僅在當(dāng)前Http Request內(nèi)有效殖氏。,針對每一次Http請求晚树,Spring容器根據(jù)該bean的定義創(chuàng)建一個全新的實例,且該實例僅在當(dāng)前Http請求內(nèi)有效雅采,而其它請求無法看到當(dāng)前請求中狀態(tài)的變化爵憎,當(dāng)當(dāng)前Http請求結(jié)束,該bean實例也將會被銷毀婚瓜。
<bean id="loginAction" class="com.foo.LoginAction" scope="request"/>
@RequestScope
@Component
public class LoginAction {
// ...
}
session:在一次Http Session中宝鼓,容器會返回該Bean的同一實例。而對不同的Session請求則會創(chuàng)建新的實例巴刻,該bean實例僅在當(dāng)前Session內(nèi)有效愚铡。
,同Http請求相同,每一次session請求創(chuàng)建新的實例胡陪,而不同的實例之間不共享屬性沥寥,且實例僅在自己的session請求內(nèi)有效,請求結(jié)束柠座,則實例將被銷毀邑雅。
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
@SessionScope
@Component
public class UserPreferences {
// ...
}
global Session:在一個全局的Http Session中,容器會返回該Bean的同一個實例妈经,僅在使用portlet context時有效淮野。
<bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/>