ContextLoaderListener vs DispatcherServlet
In XML based Spring MVC configuration, you must have seen two declarations in web.xml
file i.e. ContextLoaderListener
and DispatcherServlet
. Let’s try to understand their purpose in framework and their differences.
Root and child contexts
Before reading further, please understand that –
- Spring can have multiple contexts at a time. One of them will be root context, and all other contexts will be child contexts.
- All child contexts can access the beans defined in root context; but opposite is not true. Root context cannot access child contexts beans.
DispatcherServlet – Child application contexts
DispatcherServlet
is essentially a Servlet (it extends HttpServlet
) whose primary purpose is to handle incoming web requests matching the configured URL pattern. It take an incoming URI and find the right combination of controller and view. So it is the front controller.
When you define a DispatcherServlet
in spring configuration, you provide an XML file with entries of controller classes, views mappings etc. using contextConfigLocation
attribute.
< servlet > < servlet-name >employee-services</ servlet-name > < servlet-class >org.springframework.web.servlet.DispatcherServlet</ servlet-class > < init-param > < param-name >contextConfigLocation</ param-name > < param-value >classpath:employee-services-servlet.xml</ param-value > </ init-param > < load-on-startup >1</ load-on-startup > </ servlet > |
If you do not provide configuration file then it will load its own configuration file using [servlet_name]-servlet.xml
. Web applications can define any number of DispatcherServlet
entries. Each servlet will operate in its own namespace, loading its own application context with mappings, handlers, etc.
It means that each DispatcherServlet
has access to web application context. Until specified, each DispatcherServlet
creates own internal web application context.
DispatcherServlet(WebApplicationContext webApplicationContext)
create a new DispatcherServlet
with the given web application context. It is possible only in Servlet 3.x environment through the ServletContext.addServlet(java.lang.String, java.lang.String)
API support.ContextLoaderListener – Root application context
ContextLoaderListener
creates the root application context and will be shared with child contexts created by all DispatcherServlet
contexts. You can have only one entry of this in web.xml
.
< listener > < listener-class > org.springframework.web.context.ContextLoaderListener </ listener-class > </ listener > < context-param > < param-name >contextConfigLocation</ param-name > < param-value >/WEB-INF/spring/applicationContext.xml</ param-value > </ context-param > |
The context of ContextLoaderListener
contains beans that globally visible, like services, repositories, infrastructure beans, etc. After the root application context is created, it’s stored in ServletContext
as an attribute, the name is:
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this .context); //Where attibute is defined in /org/springframework/web/context/WebApplicationContext.java as WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext. class .getName() + ".ROOT" ; |
To get root application context in Spring controller, you can use WebApplicationContextUtils
class.
@Autowired ServletContext context; ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(context); if (ac == null ){ return "root application context is null" ; } |
ContextLoaderListener vs DispatcherServlet
Below image describe the whole relation in single view.
ContextLoaderListener vs DispatcherServlet
ContextLoaderListener
creates root application context.DispatcherServlet
entries create one child application context per servlet entry.- Child contexts can access beans defined in root context.
- Beans in root context cannot access beans in child contexts (directly).
- All contexts are added to
ServletContext
. - You can access root context using
WebApplicationContextUtils
class.
Summary
Generally, you will define all MVC related beans (controller and views etc) in DispatcherServlet
context, and all cross-cutting beans such as security, transaction, services etc. at root context by ContextLoaderListener
.
Generally, this setup works fine because rarely you will need to access any MVC bean (from child context) into security related class (from root context). Mostly we use security beans on MVC classes, and they can access it with above setup.
Happy Learning !!
https://howtodoinjava.com/spring-mvc/contextloaderlistener-vs-dispatcherservlet/
ContextLoaderListener vs DispatcherServlet的更多相关文章
- 【转】ContextLoaderListener和DispatcherServlet加载内容的区别
一.ContextLoaderListener加载内容 二.DispatcherServlet加载内容 ContextLoaderListener和DispatcherServlet都会在Web容器启 ...
- web.xml中的ContextLoaderListener和DispatcherServlet区别
ContextLoaderListener和DispatcherServlet都会在Web容器启动的时候加载一下bean配置. 区别在于: DispatcherServlet一般会加载MVC相关的be ...
- 使用shiro 框架 报错No WebApplicationContext found: no ContextLoaderListener or DispatcherServlet registered?
1.问题描述:ssm 框架中使用shiro 中出现问题 原来web.xml 文件如下: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, ...
- 【转】ContextLoaderListener 和 DispatcherServlet
转载地址: http://www.guoweiwei.com/archives/797 DispatcherServlet介绍 DispatcherServlet是Spring前端控制器的实现,提供S ...
- ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别
spring通过在web.xml 中配置ContextLoaderListener 来加载context配置文件,在DispatcherServlet中也可以来加载spring context配置文件 ...
- Spring ContextLoaderListener与DispatcherServlet所加载的applicationContext的区别
http://www.lai18.com/content/9755931.html Spring 容器(Spring 的上下文) https://my.oschina.net/jast90/blog/ ...
- ContextLoaderListener和Spring MVC中的DispatcherServlet加载内容的区别
一:ContextLoaderListener加载内容 二:DispatcherServlt加载内容 ContextLoaderListener和DispatcherServlet都会在Web容器启动 ...
- 【Spring】浅谈ContextLoaderListener及其上下文与DispatcherServlet的区别
一般在使用SpingMVC开发的项目中,一般都会在web.xml文件中配置ContextLoaderListener监听器,如下: <listener> <listener-clas ...
- ContextLoaderListener和Spring MVC中的DispatcherServlet加载内容的区别【转】
原文地址:https://blog.csdn.net/py_xin/article/details/52052627 ContextLoaderListener和DispatcherServlet都会 ...
随机推荐
- 什么是ppa
What is ppa? PPAs are for non standard software/updates. They are generally used by people who want ...
- C#基础提升系列——C#集合
C#集合 有两种主要的集合类型:泛型集合和非泛型集合. 泛型集合被添加在 .NET Framework 2.0 中,并提供编译时类型安全的集合. 因此,泛型集合通常能提供更好的性能. 构造泛型集合时, ...
- Cytoscape基础教程笔记
昨天开始学用Cytoscape,其tutorial分为两个部分,基础的和高级 的.基础教程又分成了四课:Getting Started.Filters & Editor.Fetching Ex ...
- C#-弄懂泛型和协变、逆变
脑图概览 泛型声明和使用 协变和逆变 <C#权威指南>上在委托篇中这样定义: 协变:委托方法的返回值类型直接或者间接地继承自委托前面的返回值类型; 逆变:委托签名中的参数类型继承自委托方法 ...
- python使用HTMLTestRunner.py生成测试报告
这里我使用的是python selenium webdriver环境,浏览器驱动安装见selenium 1.下载HTMLTestRunner.py:http://tungwaiyip.info/sof ...
- Java反射学习-4 - 反射调用方法
反射调用方法: package cn.tx.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Method ...
- Java Web学习总结(5)HttpServletRequest
一,HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
- php 封装原生数据导入的方法(csv文件格式)
//前端---部分代码 <form class="form-inline" style="margin-top: 20px" method="p ...
- CSS布局浮动和定位属性的区别
float: left|right; 可以自动排列自动折行, 但需要clear来配合清除浮动;display: inline-block 有些时候可以替代float实现相同的效果. position: ...
- soj#547 bzoj5046 分糖果游戏
分析 代码 #include<bits/stdc++.h> using namespace std; #define int long long ; ][],s[],p[],v[]; si ...