1. 程式人生 > >轉載來源:http://blog.csdn.net/nacey5201/article/details/8547772

轉載來源:http://blog.csdn.net/nacey5201/article/details/8547772

轉載來源:http://blog.csdn.net/nacey5201/article/details/8547772

一、配置方式 
在Spring2.0中除了以前的Singleton和Prototype外又加入了三個新的web作用域,分別為request、session和global session,如果你想讓你的容器裡的某個bean擁有其中某種新的web作用域,除了在bean級上配置相應的scope屬性,還必須在容器級做一個額外的初始化配置。 

Java程式碼  收藏程式碼
  1. <web-app>  
  2.   
  3.       <listener>  
  4.             <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>  
  5.       </listener>  
  6.   
  7. </web-app>  

如果你用的是早期版本的web容器(Servlet 2.4以前),那麼你要使用一個javax.servlet.Filter的實現。 

Java程式碼  收藏程式碼
  1. <web-app>  
  2. ...  
  3.     <filter>  
  4.         <filter-name>requestContextFilter</filter-name>  
  5.         <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>  
  6.     </filter>  
  7.     <filter-mapping>  
  8.         <filter-name>requestContextFilter</filter-name>  
  9.         <url-pattern>/*</url-pattern>  
  10.     </filter-mapping>  
  11. ...  
  12. </web-app>  

兩種方式完成完全一樣的功能:基於LocalThread將HTTP request物件繫結到為該請求提供服務的執行緒上。這使得具有request和session作用域的bean能夠在後面的呼叫鏈中被訪問到。 

Request作用域 
<bean id="loginAction" class="com.foo.LoginAction" scope="request"/> 

針對每次HTTP請求,Spring容器會根據loginAction bean定義建立一個全新的LoginAction bean例項,且該loginAction bean例項僅在當前HTTP request內有效,因此可以根據需要放心的更改所建例項的內部狀態,而其他請求中根據loginAction bean定義建立的例項,將不會看到這些特定於某個請求的狀態變化。當處理請求結束,request作用域的bean例項將被銷燬。 
//很好理解,一個request只有一個loginAction例項。每次有request過來都會生成對應的新的例項。

Session作用域 
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/> 
針對某個HTTP Session,Spring容器會根據userPreferences bean定義建立一個全新的userPreferences bean例項,且該userPreferences bean僅在當前HTTP Session內有效。與request作用域一樣,你可以根據需要放心的更改所建立例項的內部狀態,而別的HTTP Session中根據userPreferences建立的例項,將不會看到這些特定於某個HTTP Session的狀態變化。當HTTP Session最終被廢棄的時候,在該HTTP Session作用域內的bean也會被廢棄掉。 
//一個session只有一個userPreferences例項,一個session中的多個請求共用這個例項

global session作用域 

<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作用域,並且不會引起任何錯誤 
//這個我也不太明白
二、為什麼需要額外的配置RequestContextFilter 
也許會有一個疑問,已經通過ContextLoaderListener(或ContextLoaderServlet)將Web容器與Spring容器整合,為什麼這裡還要用額外的RequestContextListener以支援Bean的另外3個作用域,原因是ContextLoaderListener實現ServletContextListener監聽器介面,而ServletContextListener只負責監聽Web容器的啟動和關閉的事件。RequestContextFilter實現ServletRequestListener監聽器介面,該監聽器監聽HTTP請求事件,Web伺服器接收的每次請求都會通知該監聽器。通過配置RequestContextFilter,Spring容器與Web容器結合的更加密切。 
一、配置方式 
在Spring2.0中除了以前的Singleton和Prototype外又加入了三個新的web作用域,分別為request、session和global session,如果你想讓你的容器裡的某個bean擁有其中某種新的web作用域,除了在bean級上配置相應的scope屬性,還必須在容器級做一個額外的初始化配置。 

Java程式碼  收藏程式碼
  1. <web-app>  
  2.   
  3.       <listener>  
  4.             <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>  
  5.       </listener>  
  6.   
  7. </web-app>  

如果你用的是早期版本的web容器(Servlet 2.4以前),那麼你要使用一個javax.servlet.Filter的實現。 

Java程式碼  收藏程式碼
  1. <web-app>  
  2. ...  
  3.     <filter>  
  4.         <filter-name>requestContextFilter</filter-name>  
  5.         <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>  
  6.     </filter>  
  7.     <filter-mapping>  
  8.         <filter-name>requestContextFilter</filter-name>  
  9.         <url-pattern>/*</url-pattern>  
  10.     </filter-mapping>  
  11. ...  
  12. </web-app>  

兩種方式完成完全一樣的功能:基於LocalThread將HTTP request物件繫結到為該請求提供服務的執行緒上。這使得具有request和session作用域的bean能夠在後面的呼叫鏈中被訪問到。 

Request作用域 
<bean id="loginAction" class="com.foo.LoginAction" scope="request"/> 

針對每次HTTP請求,Spring容器會根據loginAction bean定義建立一個全新的LoginAction bean例項,且該loginAction bean例項僅在當前HTTP request內有效,因此可以根據需要放心的更改所建例項的內部狀態,而其他請求中根據loginAction bean定義建立的例項,將不會看到這些特定於某個請求的狀態變化。當處理請求結束,request作用域的bean例項將被銷燬。 
//很好理解,一個request只有一個loginAction例項。每次有request過來都會生成對應的新的例項。

Session作用域 
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/> 
針對某個HTTP Session,Spring容器會根據userPreferences bean定義建立一個全新的userPreferences bean例項,且該userPreferences bean僅在當前HTTP Session內有效。與request作用域一樣,你可以根據需要放心的更改所建立例項的內部狀態,而別的HTTP Session中根據userPreferences建立的例項,將不會看到這些特定於某個HTTP Session的狀態變化。當HTTP Session最終被廢棄的時候,在該HTTP Session作用域內的bean也會被廢棄掉。 
//一個session只有一個userPreferences例項,一個session中的多個請求共用這個例項

global session作用域 

<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作用域,並且不會引起任何錯誤 
//這個我也不太明白
二、為什麼需要額外的配置RequestContextFilter 
也許會有一個疑問,已經通過ContextLoaderListener(或ContextLoaderServlet)將Web容器與Spring容器整合,為什麼這裡還要用額外的RequestContextListener以支援Bean的另外3個作用域,原因是ContextLoaderListener實現ServletContextListener監聽器介面,而ServletContextListener只負責監聽Web容器的啟動和關閉的事件。RequestContextFilter實現ServletRequestListener監聽器介面,該監聽器監聽HTTP請求事件,Web伺服器接收的每次請求都會通知該監聽器。通過配置RequestContextFilter,Spring容器與Web容器結合的更加密切。