【Spring学习18】bean作用域:Web作用域及配置

来源:互联网 发布:周易取名 知乎 编辑:程序博客网 时间:2024/05/21 15:01

上篇提到常用的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 0
原创粉丝点击