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

来源:互联网 发布:元符道人淘宝 编辑:程序博客网 时间:2024/05/03 00:16

本篇博客转载自 http://user.qzone.qq.com/413670706/blog/1471574740

Spring通过在web.xml 中配置Listenter : org.springframework.web.context.ContextLoaderListener 来加载spring context配置文件,SpringMVC也可以通过在web.xml 中配置Servlet : org.springframework.web.servlet.DispatcherServlet来加载spring context配置文件,那么这两个有什么区别呢。

ContextLoaderListener加载的spring 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加载的spring context配置文件成功后,如果 publishContext属性的值设置为true的话(缺省为true) 会将applicationContext存放在org.springframework.web.servlet.FrameworkServlet.CONTEXT. + (servletName)的attribute中。
       如:web.xml中配置如下



则对应的applicationContext的attribute key值为org.springframework.web.servlet.FrameworkServlet.CONTEXT.DispatcherServlet 

 在每次request请求时,DispatcherServlet会将此applicationContext存放在request中attribute值为 org.springframework.web.servlet.DispatcherServlet.CONTEXT中(request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE,getWebApplicationContext());)。可以通过RequestContextUtils.getWebApplicationContext(servletContext,attrname)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。




解决此问题的方法:在web.xml 中配置Listenter : org.springframework.web.context.ContextLoaderListener 来加载spring context配置文件


0 0
原创粉丝点击