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都会 ...
随机推荐
- 【Shiro】SpringBoot集成Shiro
项目版本: springboot2.x shiro:1.3.2 Maven配置: <dependency> <groupId>org.apache.shiro</grou ...
- window 安装iis和使用
一.IIS安装(服务名World Wide Web Publishing Service) 实验环境:win2008R2虚拟机1.首先打开虚拟机,然后选中管理工具->服务器管理器. 2.选中角色 ...
- 杂项:电子表格程序-u
ylbtech-杂项:电子表格程序-u 1.返回顶部 1.1 https://www.gemboxsoftware.com/spreadsheet 1.1 https://www.spreadshee ...
- 116、TensorFlow变量的版本
import tensorflow as tf v = tf.get_variable("v", shape=(), initializer=tf.zeros_initialize ...
- kubernetes原理
kubernetes 核心组件 etcd:保存整个集群的状态 apiserver:提供资源操作的唯一入口,并提供认证.授权.访问控制.api注册和发现等机制 controller manager:负责 ...
- spring boot 尚桂谷学习笔记10 数据访问02 mybatis
数据访问 mybatis 创建一个 springboot 工程,模块选择 sql 中 mysql(数据驱动), jdbc(自动配置数据源), mybatis Web模块中选择 web pom 引入: ...
- jsbridge 原理
https://juejin.im/post/5abca877f265da238155b6bc
- Percona XtraDB Cluster集群5.7 开启SSL认证
mysqldump -uroot -p --ssl-cert=/data/mysql/client-cert.pem --ssl-key=/data/mysql/client-key.pem -h 1 ...
- PAT甲级【2019年3月考题】——A1159 Structure_of_a_BinaryTree【30】
Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and i ...
- Cocos2d之FlyBird开发---简介
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 开发FlyBird其实非常的简单,在游戏的核心部分,我们需要实现的只有: 创建一个物理世界(世界设置重力加速度) 在物理世界中添加一个动态 ...