Spring ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别

转载 2015年11月19日 17:38:11
spring通过在web.xml 中配置ContextLoaderListener 来加载context配置文件,在DispatcherServlet中也可以来加载spring context配置文件,那么这两个有什么区别呢。

ContextLoaderListener中加载的context成功后,spring 将 applicationContext存放在ServletContext中key值为"org.springframework.web.context.WebApplicationContext.ROOT"的attribute中。(servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context));可以通过WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext)或WebApplicationContextUtils.getWebApplicationContext(servletContext)方法来获取对应的applicationContext。

DispatcherServlet加载的context成功后,如果 publishContext属性的值设置为true的话(缺省为true) 会将applicationContext存放在org.springframework.web.servlet.FrameworkServlet.CONTEXT. + (servletName)的attribute中。

例如 web.xml中配置如下 

<servlet>  
    <servlet-name>mvcServlet</servlet-name>  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    <init-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>classpath*:/spring/config/applicationContextMVC.xml</param-value>  
    </init-param>  
    <load-on-startup>1</load-on-startup>  
</servlet> 
则对应的applicationContext的attribute key值为org.springframework.web.servlet.FrameworkServlet.CONTEXT.mvcServlet。

  在每次request请求时,DispatcherServlet会将此applicationContext存放在request中attribute值为 org.springframework.web.servlet.DispatcherServlet.CONTEXT中(request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE,getWebApplicationContext());)。可以通过 RequestContextUtils.getWebApplicationContext 或 WebApplicationContextUtils.getWebApplicationContext(servletContext,attrname)方法 来获取对应的applicationContext。

  从上面的分析可以看出,DispatcherServlet所加载的applicationContext可以认为是mvc私有的context,由于保存在servletContext中的key值与通过ContextLoaderListener加载进来的applicationContext使用的key值不相同,因此如果只使用DispatcherServlet加载context的话,如果程序中有地方使用WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext) 来试图获取applicationContext时,就会抛出"No WebApplicationContext found: no ContextLoaderListener registered?"的exception。

搭建spring框架的时候,web.xml中的spring相关配置,可以不用配置ContextLoaderListener(即只配DispatcherServlet)吗?

搭建spring框架的时候,web.xml中的spring相关配置,可以不用配置org.springframework.web.context.ContextLoaderListener吗(即只配or...
  • Ideality_hunter
  • Ideality_hunter
  • 2016年11月24日 11:13
  • 4030

springMVC源码分析--容器初始化(一)ContextLoaderListener

在spring Web中,需要初始化IOC容器,用于存放我们注入的各种对象。当tomcat启动时首先会初始化一个web对应的IOC容器,用于初始化和注入各种我们在web运行过程中需要的对象。当tomc...
  • qq924862077
  • qq924862077
  • 2016年10月10日 19:12
  • 3652

spring (一) 不同版本加载 bean 的方式

package com.spring.hello;import org.junit.Test; import org.springframework.beans.factory.BeanFactory...
  • Cheat1173010256
  • Cheat1173010256
  • 2016年01月17日 14:29
  • 550

Spring中ApplicationContext加载机制和配置初始化

Spring中ApplicationContext加载机制。         加载器目前有两种选择:ContextLoaderListener和ContextLoaderServlet。       ...
  • aimiaochun1
  • aimiaochun1
  • 2017年06月21日 14:18
  • 1090

Spring中ApplicationContext加载机制和配置初始化

Spring中ApplicationContext加载机制。         加载器目前有两种选择:ContextLoaderListener和ContextLoaderServlet。     ...
  • luman1991
  • luman1991
  • 2016年11月09日 20:20
  • 1683

spring项目中监听器作用-ContextLoaderListener(项目启动时,加载一些东西到缓存中)

作用:在启动Web容器时,自动装配spring applicationContext.xml的配置信息。 因为它实现了ServletContextListener这个接口,在web.xml配置这个监...
  • littlelittleguai
  • littlelittleguai
  • 2017年06月25日 20:42
  • 208

Spring MVC 原理 - DispatcherServlet调用完整过程(上)

进入web.xml中配置的Spring拦截(调度)器:   调用堆栈信息: 开始拦截,这一步主要是根据request获取handler(该handler可以配置): (接上面方法)这...
  • isea533
  • isea533
  • 2014年03月10日 21:03
  • 14325

spring里头各种获取ApplicationContext的方法

为啥写这个文章呢?spring各个版本不同,以及和系统框架套在一起不同,导致获取的方式不同,网络上各种版本,太乱了,写获取方式的人都不写这个获取方式是在本地还是在WEB,在那种应用服务器下,在spri...
  • xieyuooo
  • xieyuooo
  • 2013年01月06日 16:53
  • 51612

SpringMVC工作原理解读--DispatcherServlet类源码解读(初级)

我这里先通读一下DispatcherServlet的代码,首先知道各个部分是什么用处,后面再次进行串联的讲解。一开始我可能也讲的不是很明白,但是时间久了我觉得自然而然的就明白了。读者可以发布自己的意见...
  • wangyang1354
  • wangyang1354
  • 2016年07月22日 22:18
  • 2618

Spring 源码解析之DispatcherServlet源码解析(五)

Spring 源码解析之DispatcherServlet源码解析(五)前言 本文需要有前四篇文章的基础,才能够清晰易懂,有兴趣可以先看看详细的流程,这篇文章可以说是第一篇文章,也可以说是前四篇文...
  • veZunShao
  • veZunShao
  • 2016年05月30日 22:27
  • 5916
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别
举报原因:
原因补充:

(最多只允许输入30个字)