Request作用域
<bean id="loginAction" class="com.foo.LoginAction" scope="request"/>
針
對每次HTTP請求,Spring容器會根據loginAction bean定義建立一個全新的LoginAction
bean例項,且該loginAction bean例項僅在當前HTTP
request內有效,因此可以根據需要放心的更改所建例項的內部狀態,而其他請求中根據loginAction
bean定義建立的例項,將不會看到這些特定於某個請求的狀態變化。當處理請求結束,request作用域的bean例項將被銷燬。
針
對某個HTTP Session,Spring容器會根據userPreferences bean定義建立一個全新的userPreferences
bean例項,且該userPreferences bean僅在當前HTTP
Session內有效。與request作用域一樣,你可以根據需要放心的更改所建立例項的內部狀態,而別的HTTP
Session中根據userPreferences建立的例項,將不會看到這些特定於某個HTTP Session的狀態變化。當HTTP
Session最終被廢棄的時候,在該HTTP Session作用域內的bean也會被廢棄掉。
<bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/>
請注意,假如你在編寫一個標準的基於Servlet的web應用,並且定義了一個或多個具有global session作用域的bean,系統會使用標準的HTTP Session作用域,並且不會引起任何錯誤
二、為什麼需要額外的配置RequestContextFilter
也
許會有一個疑問,已經透過ContextLoaderListener(或ContextLoaderServlet)將Web容器與Spring容器整
合,為什麼這裡還要用額外的RequestContextListener以支援Bean的另外3個作用域,原因是
ContextLoaderListener實現ServletContextListener監聽器介面,而
ServletContextListener只負責監聽Web容器的啟動和關閉的事件。RequestContextFilter實現
ServletRequestListener監聽器介面,該監聽器監聽HTTP請求事件,Web伺服器接收的每次請求都會通知該監聽器。透過配置
RequestContextFilter,Spring容器與Web容器結合的更加密切。
三、作用域依賴問題
如果將Web相關作用域的Bean注入到singleton或prototype的Bean中,這種情況下,需要Spring AOP
"car" class="com.demo.Car" scope="request">
<aop:scoped-proxy/>
</bean>
"boss" class="com.demo.Boss" >
"car" ref="car" />
</bean>