DispatcherServlet 被加载顺序
javax.servlet.Servlet#init 0
-> javax.servlet.GenericServlet#init(javax.servlet.ServletConfig) 1
-> javax.servlet.GenericServlet#init() 2
-> org.springframework.web.servlet.HttpServletBean#init 3
-> org.springframework.web.servlet.HttpServletBean#initServletBean 4
-> org.springframework.web.servlet.FrameworkServlet#initServletBean 5
-> org.springframework.web.servlet.FrameworkServlet#initWebApplicationContext 6
-> org.springframework.web.servlet.FrameworkServlet#onRefresh 7
-> org.springframework.web.servlet.DispatcherServlet#onRefresh 8 org.springframework.web.servlet.DispatcherServlet实例化起始:
- org.springframework.web.servlet.HttpServletBean#init:148行开始 -> 174行结束 2实现0中init方法接口
1的有参init调用2的无参重写0的init方法
3重写1的空参init方法
3中会调用4的空参空方法体方法initServletBean
5重写4中的空参空方法体方法initServletBean
5调用6的空参方法initWebApplicationContext 6方法执行完553行后,ApplicationContext器会准备就绪
* 此时会通过判断 556行,[!this.refreshEventReceived] 判断是否已经接收容器准备就绪事件,
如果已经接收,则表示已经调用org.springframework.web.servlet.FrameworkServlet.ContextRefreshListener#onApplicationEvent监听委托方法,
说明已经调用7的onRefresh进行下一步初始化操作
* 如果未接收容器准备就绪事件,则调用 7的onRefresh进行下一步初始化操作,之后会将ApplicationContext容器放入servletContext中
String attrName = getServletContextAttributeName();
getServletContext().setAttribute(attrName, wac);
* 直接会调用org.springframework.web.servlet.FrameworkServlet#initFrameworkServlet方法
* 至此完成初始化工作 说明:7的方法空参方法onRefresh,会被8中onRefresh方法重写,实际调用为8中方法 另:
对于7的onRefresh方法,在FrameworkServlet类中有两个方法进行调用
1个是7中的initWebApplicationContext方法
2个是org.springframework.web.servlet.FrameworkServlet#onApplicationEvent方法,
该方法被内部类的org.springframework.web.servlet.FrameworkServlet.ContextRefreshListener#onApplicationEvent方法调用,
主要用于(ApplicationListener endpoint that receives events from this servlet's WebApplicationContext only,
delegating to onApplicationEvent on the FrameworkServlet instance.)
【ApplicationListener类的监听端点,仅接收这个servlet WebApplicationContext事件,
并委托给FrameworkServlet.ContextRefreshListener内部类中的onApplicationEvent方法,该监听器方法监听ContextRefreshedEvent事件,
触发条件为ApplicationContext 被初始化或刷新时,该事件被发布。
这也可以在 ConfigurableApplicationContext接口中使用 refresh() 方法来发生。
此处的初始化是指:所有的Bean被成功装载,后处理Bean被检测并激活,所有Singleton Bean 被预实例化,ApplicationContext容器已就绪可用】
2019-08-28 14:00
新的理解:
DispatcherServlet分为两步
1.初始化阶段
2.调用阶段
1.初始化阶段,该过程仅执行一次
最终执行节点为 org.springframework.web.servlet.DispatcherServlet#onRefresh
2.调用阶段,该过程为多次执行
最终执行节点为 org.springframework.web.servlet.DispatcherServlet#doService
DispatcherServlet 被加载顺序的更多相关文章
- web工程中web.xml元素加载顺序以及配置实例
简介 web.xml是web工程的配置文件,容器加载web工程时,会首先从WEB-INF中查询web.xml,并加载其中的配置信息,可以将web.xml认为是web工程的入口. web.xml中包含有 ...
- 3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
1.外部配置加载顺序 SpringBoot也可以从以下位置加载配置: 优先级从高到低 高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置 1.命令行参数 所有的配置都可以在命令行上进行指定 ...
- SpringMvc项目加载顺序及上下文小结
前言: 使用springMvc已经三年了,但是内部原来一直不太了解,看到ServletConetxt和ApplicationContext头就大,趁着这几天学习,正好学习下相关的知识. 1.Servl ...
- web.xml加载顺序
一 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Ser ...
- web.xml文件加载顺序
1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...
- web.xml 中的listener、 filter、servlet 加载顺序及其详解
在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...
- css样式加载顺序及覆盖顺序深入理解
注:内容转载 很多的新手朋友们对css样式加载顺序和覆盖顺序的理解有所偏差,下面用示例为大家详细的介绍下,感兴趣的朋友不要错过 { height: 100%; width: 200; position ...
- Java---类加载机制,构造方法,静态变量,(静态)代码块,父类,变量加载顺序
直接上代码: 代码1: public class ConstroctTest { private static ConstroctTest test = new ConstroctTest(); // ...
- DOM加载顺序
最近一直在困扰dom的加载顺序问题,经常会遇到以为绑定好的事件不响应等情况,一头雾水,直到请教了周围的同事,才发现了解dom的加载顺序是多么的重要. 关于这个问题,其实网上已经有一些介绍,但是我觉得并 ...
随机推荐
- Python学习日记(二十九) 网络编程
早期的计算机通信需要有一个中间件,A要给B传东西,A必须要把信息传给中间件,B再把从中间件中拿到信息 由于不同机器之间需要通信就产生了网络 软件开发的架构 1.C/S架构 服务器-客户机,即Clien ...
- Spring中获取被代理的对象
目录 Spring中获取被代理的对象 获取Spring被代理对象什么时候可能会用到? Spring中获取被代理的对象 Spring中获取被代理的对象 ### 获取Spring被代理对象的JAVA工具类 ...
- SHELL脚本编程-普通数组(列表)和关联数组(字典)
SHELL脚本编程-普通数组(列表)和关联数组(字典) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组相关概述 变量: 存储单个元素的内存空间 数组: 存储多个元素的连续的 ...
- pip的安装、以及使用方法。
pip类似RedHat里面的yum,安装Python包非常方便.本节详细介绍pip的安装.以及使用方法. 1.pip下载安装 1.1 pip下载 1 # wget "https://py ...
- Django设置应用名与模型名为中文
修改polls包里面的apps.py: from django.apps import AppConfig class PollsConfig(AppConfig): name = 'polls' v ...
- Android init介绍(上)
1. 介绍 init进程是Linux系统第一个用户进程,是Android系统应用程序的根进程,即1号进程(PID为1):Android中的init文件位于/init,代码位于system/core/i ...
- PHP CGI 进程占用CPU过高导致CPU使用达到100%的另类原因
由于使用的华为云的CDN加速,结果发现我的阿里云服务器突然卡顿,网页打开极慢.登陆华为云CDN管理后台发现最高带宽占用30M,流量短时间内达到10GB以上,这么大的流量我的服务器肯定扛不住啊.于是还跟 ...
- 合并K个有序链表
方法一:采用归并的思想将链表两两合并,再将两两合并后的链表做同样的操作直到合并为只有一个新的链表为止. 归类的时间复杂度是O(logn),合并两个链表的时间复杂度是O(n),则总的时间复杂度大概是O( ...
- windbg自行下载的sos.dll存放路径“..\SOS_x86_x86_4.7.3132.00.dll\5B5543296ee000\”里的“5B5543296ee000”是什么?
问题的引出 我在调试某个崩溃问题时,要跟踪clr的栈,于是,我先执行了指令.loadby sos clrjit,没有报错,然后我又执行!clrstack,结果却有如下输出:0:000:x86> ...
- 使用gitbase 分析git 仓库代码
gitbase 是一个基于golang 开发的开源git 仓库sql 接口查询引擎,基于此工具,我们可以方便的分析git 仓库代码的情况 而且可以基于源码的分析,还是很强大的 安装 直接使用编译的 ...