【Spring学习18】bean作用域:Web作用域及配置
上篇提到常用的Web作用域有:Request, session, globalSession(portlet容器上使用) Web作用域介绍一、Request对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,每个HTTP request中的实例都是独立互不影响的的。比如下面bean定义:<bean id="userrole" class="twm.demo.UserRole
上篇提到常用的Web作用域有:Request, session, globalSession(portlet容器上使用)
Web作用域介绍
一、Request
对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,每个HTTP request中的实例都是独立互不影响的的。
比如下面bean定义:
<bean id="userrole" class="twm.demo.UserRole" scope="request" />
针对每次HTTP请求,Spring容器会创建一个全新的twm.demo.UserRole bean实例userrole bean, 且userrole bean仅在当前HTTP request内有效。
因此当request A请求创建并更改了userrole bean的内部状态,request B请求中创建的userrole bean,并不会有相应的这些状态变化。
当处理请求结束,request作用域的bean实例将被销毁。
二、Session
和Request很类似,对于每个HTTP Session,使用session定义的Bean都将产生一个新实例。每个HTTP Session中的实例都是独立互不影响的的。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。
这里重点要明白request 作用域 和session作用域的差别:
一个http session中可以有多个request
简单说就是,用户A访问同一网站的PageA和PageB,这就有两个http request,但是只有一个http session
用户A,B,C三人同时访问这个网站的PageA,这就有三个http request,同时也有三个 http session
三、globalSession
global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。
以上web作用域只有在spring web ApplicationContext的实现中(比如XmlWebApplicationContext)才会起作用,若在常规Spring IoC容器中使用,比如ClassPathXmlApplicationContext中,就会收到一个异常IllegalStateException来告诉你不能识别的bean作用域
初始化web配置
为了支持request,sesssion,global session这种级别bean的作用域(web作用域bean),在定义bean之前需要一些初始化的小配置。
目的是为了使Spring捕获到相应的事件(如request请求开始,request请求结束,session会话开始,sesssion会话结束等。)
这里分两种情况:
1、 SpringMVC:
若使用 SpringMVC访问这些作用域bean,实际上是使用Srping DispatcherServlet类或者DispatcherPortlet类处理request,则无需特别配置。因为DispatcherServlet 和 DispatcherPortlet已经暴露了所有的相关状态。
2、非Spring的DispacherServlet
若使用了非Spring的DispacherServlet处理请求,比如Struts,则需要注册:
2.1、Servlet 2.4及以上的web容器,需要在web.xml中增加监听器:
<web-app>
...
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
...
</web-app>
2.2、Servlet2.4以前的web容器,在web.xml中增加过滤器:
<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都是做相同的事儿,也就是绑定HTTPrequest对象到服务的Thread线程中,并开启接下来 用到的session-scoped功能。
更多推荐
所有评论(0)