ContextLoaderListener与RequestContextListener配置问题

2023-05-16

https://blog.csdn.net/yanweju/article/details/70622313

在SSH2、SSM等web应用开发框架的配置过程中,因为都要用到Spring,所以,往往我们首先都要配置Spring。Spring配置过程中要考虑两个监听器:ContextLoaderListener与RequestContextListener。这两个监听器是什么意思?是不是两个监听器都需要配置?它们之间到底存在什么关系?下面,根据实验和网上的资料解释,我将汇总如下:

ContextLoaderListener与RequestContextListener
ContextLoaderListener
ContextLoaderListener extends ContextLoader implements ServletContextListener。

ServletContextListener extends EventListener。 
ServletContextListener只负责监听Web容器的启动和关闭的事件。

ContextLoaderListener(或ContextLoaderServlet)将Web容器与spring容器进行整合。

这是使用Spring 必须配置 的:

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener> 
1
2
3
Spring配置文件的声明:

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:applicationContext.xml</param-value>
</context-param>
1
2
3
4
如果没有显式声明,则 系统默认 在WEB-INF/applicationContext.xml。

在一个团队使用Spring的实际项目中,应该需要多个Spring的配置文件,如何使用和交叉引用的问题: 
如果想装入多个配置文件,可以用逗号作分隔符,如:

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>applicationContext-database.xml,applicationContext.xml</param-value>
</context-param>
1
2
3
4
多个配置文件里的交叉引用可以用ref的external或bean解决,例如:

applicationContext.xml

<bean id="userService" class="domain.user.service.impl.UserServiceImpl"> 
    <property name="dbbean">
         <ref bean="dbBean"/>
    </property> 
</bean>
1
2
3
4
5
dbBean在applicationContext-database.xml中。

RequestContextListener
RequestContextListener implements ServletRequestListener

ServletRequestListener extends EventListener 
ServletRequestListener监听HTTP请求事件,Web服务器接收的每次请求都会通知该监听器。

RequestContextListener将Spring容器与Web容器结合的更加密切。这是可选配置,并且后者与scope=”request”搭配使用:

<listener>
  <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
1
2
3
两者区别
ContextLoaderListener(或ContextLoaderServlet)将Web容器与spring容器整合。RequestContextListener将Spring容器与Web容器结合的更加密切。 
前者为必选配置,后者为可选配置,并且后者与scope=”request”搭配使用。

详细案例解析
spring IOC容器实例化Bean的方式有:

singleton 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在.

prototype 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行new XxxBean()的操作.

request 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于webApplicationContext环境.

session 同一个HTTP session共享一个Bean,不同HTTP session使用不同的Bean,该作用域仅适用于webApplicationContext环境。

globalSession同一个全局session共享一个Bean,一般用于portlet应用环境,该作用域仅适用于webApplicationContext环境。

在低版本的spring中,由于只有两个Bean作用域,所以采用singleton=”true|false”的配置方式,spring2.0为了向后兼容,依旧支持这种配置方式.不过,spring2.0推荐采用新的配置方式:scope=”<作用域类型>;”。

singleton作用域 
spring以容器的方式提供天然的单实例模式功能,任何POJO无须编写特殊的代码仅通过配置就可以了.
注意:spring将Bean的默认作用域定为singleton.

singleton例:

<bean id="car" class="com.baobaotao.scope.Car" scope="singleton"/>

<bean id="boss1" class="com.baobaotao.scope.Boss">
    <property name="car" ref="car"/>
</bean>
1
2
3
4
5
Car Bean声明为singleton(因为默认是singleton,所以可以不显式指定).

在默认情况下,spring的ApplicationContext容器在启动时,自动实例化所有singleton的Bean并缓存于容器中。虽然启动时会花费一些时间,但带来两个好处:首先对Bean提前的实例化操作会及早发现一些潜在的配置问题。其次Bean以缓存的方式保存,当运行时使用到该Bean时就无须再实例化了,加快了运行效率.如果用户不希望在容器启动时提前实例化singleton的Bean,可以通过lazy-init属性进行控制:

<bean id="boos1" class="com.baobaotao.scope.Boss" lazy-init="true">
    <property name="car" ref="car"/>
</bean>
1
2
3
lazy-init=”true”的Bean在某些情况下依旧会提前实例化:如果该Bean被其它需要提前实例化的Bean引用到,spring也将忽略延迟实例化的设置。

prototype作用域
采用scope=”prototype”指定非单实例作用域Bean,请看:

<bean id="car" class="com.baobaotao.scope.Car" scope="prototype"/>

<bean id="boss1" class="com.baobaotao.scope.Boss">
    <property name="car" ref="car"/>
</bean>

<bean id="boss2" class="com.baobaotao.scope.Boss">
    <property name="car" ref="car"/>
</bean>
1
2
3
4
5
6
7
8
9
boss1,boss2所引用的都是一个独立的Car实例.

在默认情况下,spring容器在启动时不实例化prototype的Bean。此外,spring容器将prototype的Bean交给调用者后,就不再管理它的生命周期。

web应用环境相关的Bean作用域
如果用户使用spring的webApplicationContext,则可以使用另外3种Bean的作用域:request,session和globalSession。不过,在使用这些作用域之前,首先必须在web容器中进行一些额外的配置,在高版本的web容器中,则可以利用HTTP请求监听器进行配置:

<web-app>
...
<listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
</listener>
...
</web-app>
1
2
3
4
5
6
7
8
9
细心的朋友可能有一个疑问:在介绍webApplicationContext初始化时,我们已经通过ContextLoaderListener将web容器与Spring容器整合,为什么这里又要引入一个额外的RequestContextListener以支持Bean的另外3个作用域呢?

这就是我们需要重点解释的:

在整合spring容器时使用ContextLoaderListener,它实现了ServletContextListener监听器接口,ServletContextListener只负责监听web容器启动和关闭的事件。

而RequestContextListener实现ServletRequestListener监听器接口,该监听器监听HTTP请求事件,web服务器接收的每一次请求都会通知该监听器。

spring容器启动和关闭操作由web容器的启动和关闭事件触发,但如果spring容器中的Bean需要request,session,globalsession作用域的支持,spring容器本身就必须获得web容器的HTTP请求事件,以HTTP请求的事件”驱动”Bean作用域的控制逻辑。

request作用域

顾名思义,request作用域的Bean对应一个HTTP请求和生命周期,考虑下面的配置:

<bean name="car" class="com.baobaotao.scope.Car" scope="request"/>
1
这样,每次HTTP请求调用到car Bean时,spring容器创建一个新的Car Bean,请求处理完毕后,销毁这个Bean。

session作用域

假设将以上car的作用域调整为session类型:

<bean name="car" class="com.baobaotao.scope.Car" scope="session"/>
1
这样配置后,car Bean的作用域横跨整个HTTP session,session中所有HTTP请求都共享同一个Car Bean,当HTTP Session结束后,实例才被销毁.

globalSession作用域

下面的配置片断将car的作用域设置为了globalSession:

<bean name="loginController" class="com.baobaotao.scope.Car" scope="globalSession"/>
1
globalSession作用域类似于session作用域,不过仅在portlet的web应用中使用。Portlet规范定义了全局Session概念,它被组成portlet web应用的所有子portlet共享。如果不在Portlet web应用环境下,globalSession自然等价于session作有域了。
--------------------- 
作者:庭前的梧桐树 
来源:CSDN 
原文:https://blog.csdn.net/yanweju/article/details/70622313 
版权声明:本文为博主原创文章,转载请附上博文链接!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ContextLoaderListener与RequestContextListener配置问题 的相关文章

  • YAML 语言教程

    作者 xff1a 阮一峰 日期 xff1a 2016年7月 4日 编程免不了要写配置文件 xff0c 怎么写配置也是一门学问 YAML 是专门用来写配置文件的语言 xff0c 非常简洁和强大 xff0c 远比 JSON 格式方便 本文介绍
  • 如何解决idea的Could not autowire. No beans of 'xxxx' type found

    打开设置setting 在左侧找到Editor xff0c 然后选择 Inspections 在右侧的搜索框下面 xff0c 找到SPRING那块 xff0c 然后找到spring的核心包 xff0c 选中spring core 找到cod
  • IntelliJ IDEA中绿色注释扫描飘红报错解决

    在IDEA中的setting中搜索 34 javadoc 34 基本上 xff0c 绿色注释飘红的问题是解决了 xff1b
  • Windows10在当前目录快速打开cmd的方法

    1 按住Shift键 xff0c 鼠标右键快捷方式 xff0c 先打开Powershell窗口 2 输入 start cmd 回车 3 这样就可以打开cmd窗口了 xff0c 并且cmd的工作目录就是当前的目录
  • marvn 环境变量配置

    1 首先下载maven xff0c 下载地址 xff1a http maven apache org download html 打开这个连接 xff1a 选择File下面的apache maven 3 2 1 bin zip链接进行下载
  • mvn命令

    在pom xml目录下 打开cmd xff0c 输入mvn命令 1 mvn dependency tree 打印项目的依赖树到控制台 mvn dependency tree gt gt D tree txt 导出依赖树到指定文件 2 mvn
  • cmd命令

    1 创建多级目录 md mkdir 目录1 目录2 目录3 C Users xxx gt pushd d D gt md 1 2 3 4 D gt pushd D 1 2 3 4 D 1 2 3 4 gt 2 pushd POPD push
  • css浏览器兼容问题

    1 CSS中几种浏览器对不同关键字的支持 xff0c 可进行浏览器兼容性重复定义 important 可被FireFox和IE7识别 可被IE6 IE7识别 可被IE6识别 43 可被IE7识别 区别IE6与FF xff1a backgro
  • mybatis annotations

    1 Alias别名 64 Documented 64 Retention RetentionPolicy RUNTIME 64 Target ElementType TYPE public 64 interface Alias String
  • Python+Flask实现股价查询系统。Python绘制股票k线走势

    文章目录 一 实现效果图二 实现思路1 获取数据 2 可视化数据三 源码获取 一 实现效果图 打开默认显示半年线 xff0c 可以通过可视化类型选择可视化k线图 高低点等 xff08 目前只完成了初版 xff0c 当查询的股票数据返回为空时

随机推荐

  • typeHandlers 类型处理器

    类型转换器官网地址 无论是 MyBatis 在预处理语句 xff08 PreparedStatement xff09 中设置一个参数时 xff0c 还是从结果集中取出一个值时 xff0c 都会用类型处理器将获取的值以合适的方式转换成 Jav
  • idea创建父子工程

    new 一个project xff0c 删除src xff0c 只保留pom文件 xff0c 作为主工程 webparent xff0c 工程目录D ideaProjects self multimodule xff1b 右键点击上面创建的
  • css基础

    层叠次序 当同一个 HTML 元素被不止一个样式定义时 xff0c 会使用哪个样式呢 xff1f 一般而言 xff0c 所有的样式会根据下面的规则层叠于一个新的虚拟样式表中 xff0c 其中数字 4 拥有最高的优先权 浏览器缺省设置外部样式
  • spring官网下载jar包

    http repo spring io release org springframework spring 查找方法 xff1a https spring io gt 点击 project https spring io projects
  • idea快捷键

    Intellij IDEA神器居然还藏着这些实用小技巧 xff0c 爽 xff01 xff01 xff01 自动补全返回值 可以引入变量 ctrl 43 alt 43 v Ctrl 43 或者 xff0c 可以跑到大括号的开头与结尾 Ctr
  • IDEA添加serialVersionUID

    打开IDEA中的 Setting gt Editor gt Inspections 选项中 xff0c java gt Serialization issues gt 将Serializable class without 39 seria
  • java序列化

    http www cnblogs com szlbm p 5504166 html Java对象表示方式1 xff1a 序列化 反序列化和transient关键字的作用 平时我们在Java内存中的对象 xff0c 是无 法进行IO操作或者网
  • Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方。

    https blog csdn net qq 27093465 article details 65444622 先说明一下好处有哪些 xff1a 1 xff0c 如果你想 new 一个空的 List xff0c 而这个 List 以后也不
  • java String ... valuese 什么意思

    jdk1 5的新特性 xff1a 变长变量 其实这种定义就类似一个数据的定义 xff0c 可以不用给它的长度加以限制 xff0c 可以传入任意多个参数 比用数据更灵活一些 xff0c 不会出现一些数组越界等的异常 如 xff1a getTy
  • debug技巧和使用

    介绍一种能debug到HashMap内部数据结构的方法 https blog csdn net victor cindy1 article details 52336983 1 这里以一个web工程为例 xff0c 点击图中按钮开始运行we
  • Linux中如何添加/删除FTP用户并设置权限?

    以阿里云服务器为例 xff0c 在linux中添加ftp用户 xff0c 并设置相应的权限 xff0c 操作步骤如下 xff1a 1 环境 xff1a ftp为vsftp 被设置用户名为test 被限制路径为 alidata www tes
  • 解析IOS二进制格式的bplist

    关于二进制格式的plist xff0c 搜到一篇博客 详解Binary Plist格式 xff0c 介绍的很详细 xff0c 但是结合github上关于一份解析bplist的代码通过结果实际来看 xff0c 博客中解析对象表的说明出现了问题
  • Java中的String,StringBuilder,StringBuffer三者的区别

    最近在学习Java的时候 xff0c 遇到了这样一个问题 xff0c 就是String StringBuilder以及StringBuffer这三个类之间有什么区别呢 xff0c 自己从网上搜索了一些资料 xff0c 有所了解了之后在这里整
  • SynthesizedAnnotation

    标识组合注解 该接口没有实现类 xff0c 具体用法待研究
  • autowire注解源码解析

    引用 xff1a https blog csdn net wang704987562 article details 80868368
  • ConcurrentHashMap解析

    https www cnblogs com ITtangtang p 3948786 html java util concurrent xff08 j u c xff09 源码阅读
  • Java中getResourceAsStream的用法

    https www cnblogs com macwhirr p 8116583 html 首先 xff0c Java中的getResourceAsStream有以下几种 xff1a 1 Class getResourceAsStream
  • Map var2 = this.bfgInstancesByKey; synchronized(this.bfgInstancesByKey) { 疑惑

    org springframework beans factory access SingletonBeanFactoryLocator useBeanFactory public BeanFactoryReference useBeanF
  • spring父子容器

    https www jb51 net article 132197 htm http www cnblogs com kevin yuan p 6404702 html https blog csdn net user xiangpeng
  • ContextLoaderListener与RequestContextListener配置问题

    https blog csdn net yanweju article details 70622313 在SSH2 SSM等web应用开发框架的配置过程中 xff0c 因为都要用到Spring xff0c 所以 xff0c 往往我们首先都