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的加载顺序是多么的重要. 关于这个问题,其实网上已经有一些介绍,但是我觉得并 ...
随机推荐
- ovirt平台新建kvm操作
登录后点击管理门户,随后计算-->虚拟机--> 新建 一般情况下需要操作的选项如下: 普通: 操作系统:linux 优化目标:服务器 描述:自定义 nic1:选择默认的网络 系统: 内存, ...
- Flask入门到放弃(五)—— 蓝图
转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/10980094.html 蓝图 Blueprint 模块化 随着flask程序越来越复杂,我们需要对 ...
- Tomcat--安装部署
Tomcat安装部署 Tomcat简介 官网:http://tomcat.apache.org/ Tomcat服务器是一个免费的开源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问 ...
- 移动端媒体查询CSS3适配规则
该媒体查询适配规则是以UI设计图750p宽度为版本的,比如PS量的是450px,在书写时写 (450rem/2/15). @media (min-width:240px) and (max-width ...
- Nastya Hasn't Written a Legend(Codeforces Round #546 (Div. 2)E+线段树)
题目链接 传送门 题面 题意 给你一个\(a\)数组和一个\(k\)数组,进行\(q\)次操作,操作分为两种: 将\(a_i\)增加\(x\),此时如果\(a_{i+1}<a_i+k_i\),那 ...
- datebox设置默认时间
1. html代码: <input id="txtBeginTime" class="easyui-datebox" data-options=" ...
- Django REST framework 使用简记
最近在参与的项目中需要使用到dajngo REST framework工具包进行开发,之前参与的项目几乎都是清一色的使用原生的django(话说偶尔也会使用一下Flask,真心不怎么喜欢这个框架),之 ...
- 通过iptables限制docker容器端口
如何限制docker暴露的对外访问端口 docker 会在iptables上加上自己的转发规则,如果直接在input链上限制端口是没有效果的.这就需要限制docker的转发链上的DOCKER表. # ...
- 给jenkins更换工作空间
如果使用jenkins的默认工作空间,它默认安放在 /var/lib/jenkins 目录下,但这个在分配Linux磁盘的时候,一般为40G,时间长或者项目多的话,很容易将磁盘空间占满,所以我们需要将 ...
- vue组件通信方式(多种方案)
一.Props传递数据 components |-Grandson1.vue //孙子1 |-Grandson2.vue //孙子2 |-Parent.vue //父亲 |-Grandson1.vue ...