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

本文深入探讨了Spring框架中ContextLoaderListener与DispatcherServlet如何加载context配置文件,并详细解释了两者之间的区别。重点阐述了ContextLoaderListener加载的context如何存储在ServletContext中,以及DispatcherServlet加载的context作为私有context的特性,同时提供了获取对应context的方法。此外,文章还对比了两种方式加载context的不同应用场景和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击查看原文地址

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中配置如下 

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。

这里做个说明
DispatcherServlet所加载的applicationContext可以认为是mvc私有的context。
通过web.xml配置ContextLoaderListener监听所加载的applicationContext,是共有的context。也就是说,DispatcherServlet的context是继承ContextLoaderListener的context。例如 DispatcherServlet 的上下文环境中有一个类Son,在ContextLoaderListener的上下文环境中是访问不到的。但是ContextLoaderListener的上下文环境中有一类Father,在DispatcherServlet 的上下文环境中是可以访问到的。

//通过request获取 应用上下文, MVC 私有bean
WebApplicationContext context = RequestContextUtils.getWebApplicationContext(request);
//通过ContextLoader获取根容器(必须在web.xml中配置ContextLoaderListener监听)
WebApplicationContext contextF = ContextLoader.getCurrentWebApplicationContext();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值