spring中WebApplicationContext、DispatcherServlet与web容器的ServletContext关系梳理
学习源码过程中,对各种context(上下文)表示很懵逼。特地留此一篇。
1.要了解各个上下文之间的关系。首先走一遍spring在web容器(tomcat)中的启动过程
a) ServletContext: tomcat启动会创建一个ServletContext,作为全局上下文以及spring容器的宿主环境。当执行Servlet的init()方法时,会触发ServletContextListener的 public void contextInitialized(ServletContextEvent sce);方法
b)WebApplicationContext: 在web.xml(上图)中我们配置了ContextLoaderListener,该listener实现了ServletContextListener的contextInitialized方法用来监听Servlet初始化事件。
下图中红框部门的注释解释了该方法的作用。即初始化根上下文(即IOC容器),也就是WebApplicationContext。该类是一个接口类,其默认实现为XmlWebApplicationContext。
在initWebApplicationContext这个方法中进行了创建根上下文,并将该上下文以key-value的方式存储到ServletContext中
以WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE为key,this.context则为value。this.context就是刚才创建的根上下文。后面就可以通过这个ServletContext通过这个key获取该上下文了。而在web.xml中还有一对重要的标签
<context-param>该标签内的<param-name>的值是固定的原因在这张图上。该常量的值就是contextConfigLocation。通过该方法去寻找定义spring的xml文件。来初始化IOC容器的相关信息。
c) DispatcherServlet的上下文: 在WebApplicationContext初始化完后。开始初始化web.xml中的servlet。这个servlet可以有多个。默认我们都使用DispatcherServlet。<servlet>标签中可以有<init-param>标签用来配置一些DispatcherServlet的初始化参数。
该servlet初始化流程是有tomcat的Servlet的init()方法触发。DispatcherServleet-继承->FrameworkServlet-继承->HttpServletBean-继承-GenericServlet- 实现 ->Servlet。这样的一条关系链。其核心方法在FrameworkServlet中的initServletBean()中
中的initWebApplicationContext()方法中。
initWebApplicationContext()方法中的第一个红色框内就是去获取之前存在Servlet中的WebApplicationContext。通过上面说的WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE作为key
取到之后,设置为当前DispatcherServlet的父上下文。并且也把该上下文存在ServletContext中。方法如下
2.
a). 通过以上的流程,可以做到各个上下文之间既可以拥有自己独立的Bean,也可以访问各个Servlet相同的Bean
b). 通过init方法创建的dispatcherServlet上下文可以访问通过ServletContextListener中创建的WebApplicationContext上下文中的bean,反之则不行。因为WebApplicationContext是dispatcherServlet上下文的父容器。
3. api文档
Copyright ©2017 皇上吉祥
检测语言 世界语 中文简体 中文繁体 丹麦语 乌克兰语 乌兹别克语 乌尔都语 亚美尼亚语 伊博语 俄语 保加利亚语 僧伽罗语 克罗地亚语 冰岛语 加利西亚语 加泰罗尼亚语 匈牙利语 南非祖鲁语 卡纳达语 印地语 印尼巽他语 印尼爪哇语 印尼语 古吉拉特语 哈萨克语 土耳其语 塔吉克语 塞尔维亚语 塞索托语 威尔士语 孟加拉语 宿务语 尼泊尔语 巴斯克语 布尔语(南非荷兰语) 希伯来语 希腊语 德语 意大利语 意第绪语 拉丁语 拉脱维亚语 挪威语 捷克语 斯洛伐克语 斯洛文尼亚语 斯瓦希里语 旁遮普语 日语 格鲁吉亚语 毛利语 法语 波兰语 波斯尼亚语 波斯语 泰卢固语 泰米尔语 泰语 海地克里奥尔语 爱尔兰语 爱沙尼亚语 瑞典语 白俄罗斯语 立陶宛语 索马里语 约鲁巴语 缅甸语 罗马尼亚语 老挝语 芬兰语 苗语 英语 荷兰语 菲律宾语 葡萄牙语 蒙古语 西班牙语 豪萨语 越南语 阿塞拜疆语 阿尔巴尼亚语 阿拉伯语 韩语 马其顿语 马尔加什语 马拉地语 马拉雅拉姆语 马来语 马耳他语 高棉语 齐切瓦语 |
世界语 中文简体 中文繁体 丹麦语 乌克兰语 乌兹别克语 乌尔都语 亚美尼亚语 伊博语 俄语 保加利亚语 僧伽罗语 克罗地亚语 冰岛语 加利西亚语 加泰罗尼亚语 匈牙利语 南非祖鲁语 卡纳达语 印地语 印尼巽他语 印尼爪哇语 印尼语 古吉拉特语 哈萨克语 土耳其语 塔吉克语 塞尔维亚语 塞索托语 威尔士语 孟加拉语 宿务语 尼泊尔语 巴斯克语 布尔语(南非荷兰语) 希伯来语 希腊语 德语 意大利语 意第绪语 拉丁语 拉脱维亚语 挪威语 捷克语 斯洛伐克语 斯洛文尼亚语 斯瓦希里语 旁遮普语 日语 格鲁吉亚语 毛利语 法语 波兰语 波斯尼亚语 波斯语 泰卢固语 泰米尔语 泰语 海地克里奥尔语 爱尔兰语 爱沙尼亚语 瑞典语 白俄罗斯语 立陶宛语 索马里语 约鲁巴语 缅甸语 罗马尼亚语 老挝语 芬兰语 苗语 英语 荷兰语 菲律宾语 葡萄牙语 蒙古语 西班牙语 豪萨语 越南语 阿塞拜疆语 阿尔巴尼亚语 阿拉伯语 韩语 马其顿语 马尔加什语 马拉地语 马拉雅拉姆语 马来语 马耳他语 高棉语 齐切瓦语 |
spring中WebApplicationContext、DispatcherServlet与web容器的ServletContext关系梳理的更多相关文章
- Spring中WebApplicationContext的研究
Spring中WebApplicationContext的研究 ApplicationContext是Spring的核 心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一些 ...
- Java Servlet与Web容器之间的关系
自从计算机软件开发进入网络时代,就开始涉及到通讯问题.在客户/服务器(也叫C/S应用)时期,每个软件都有自己的客户端和服务器端软件.并且客户端和服务器端之间的通讯协议差别也很大.后来随着互联网的发展, ...
- 三、spring boot 1.5.4 web容器定制(端口号等修改)
spring boot 默认采用tomcat作为嵌入的web容器 定制方式有三种 1. 2.如下 @Component public class CustomizationBean implement ...
- Spring中操作日志记录web请求的body报文
在spring中,通常可以使用切面编程方式对web请求记录操作日志.但是这种方式存在一个问题,那就是只能记录url中的请求参数,无法记录POST或者PUT请求的报文体,因为报文体是放在request对 ...
- httpServletRequest对象、filter、servlet、servlet容器、catalina、tomcat、以及web容器之间的关系
学习servlet的时候经常感到疑惑 HttpServletRequest是服务器创建的?还是servlet容器创建的? 过滤器是服务器创建的?还是servlet容器创建的? serlet容器和tom ...
- servlet和web容器之间的关系
Java是一种动态加载和运行的语言.也就是说当应用程序持有一个类的地址(CLASSPATH)和名称(包名和类名)的情况下,可以在程序运行期 间任何时候加载这个类,并创建和使用该类的对象.Servlet ...
- Spring中各种扩展原理及容器创建原理
一.BeanFactoryPostProcessor BeanFactory的后置处理器:在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容:所有的bean定义已经保 ...
- python中,ascii,unicode,utf8,gbk之间的关系梳理
在计算机中,经常遇到编码问题,本节主要梳理下ascii,unicode,utf8,gbk 这几种编码之间的关系. ASCII 计算机中,所有数据都以0和1来表示.在一开始的时候,要表示的内容比较少,人 ...
- Spring Cloud Gateway 不小心换了个 Web 容器就不能用了,我 TM 人傻了
个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...
随机推荐
- python语言(六)mock接口开发、发邮件、写日志、新Excel操作
一.urllib模块 urllib模块是一个标准模块,直接import urllib即可,在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块. url ...
- Taro,实现小程序在样式文件中导入背景图片
https://taro-docs.jd.com/taro/docs/static-reference.html 注意点是,控制你的图片大小,然后配置完limit后,把dist删掉,重新运行 npm ...
- LeetCode 489. Robot Room Cleaner
原题链接在这里:https://leetcode.com/problems/robot-room-cleaner/ 题目: Given a robot cleaner in a room modele ...
- Python面向对象 | 类空间及类之间的关系
一. 类的空间问题 1何处可以添加对象属性 class A: def __init__(self,name): self.name = name def func(self,sex): self.se ...
- GCD(洛谷 2568)
题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入格式 一个整数N 输出格式 答案 输入输出样例 输入 #1 4 输出 #1 4 说明/提示 ...
- Java 并发系列之六:java 并发容器(4个)
1. ConcurrentHashMap 2. ConcurrentLinkedQueue 3. ConcurrentSkipListMap 4. ConcurrentSkipListSet 5. t ...
- Spring Security教程之基于方法的权限控制(十二)
目录 1.1 intercept-methods定义方法权限控制 1.2 使用pointcut定义方法权限控制 1.3 使用注解定义方法权限控制 1.3.1 JSR-25 ...
- SpringBoot 系列教程 JPA 错误姿势之环境配置问题
191218-SpringBoot 系列教程 JPA 错误姿势之环境配置问题 又回到 jpa 的教程上了,这一篇源于某个简单的项目需要读写 db,本想着直接使用 jpa 会比较简单,然而悲催的是实际开 ...
- python 列出当前目录下的所有文件和目录名
>>> import os # 导入os模块,模块的概念后面讲到 >>> [d for d in os.listdir('.')] # os.listdir可以列出 ...
- javascript 函数的暂停和恢复
javascript 异步编程从来都是一个难题,最开始我们用 callback,但随之触发了回调地狱,于是"发明" Promise 解决 callback 嵌套过深的问题.然而由于 ...