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的加载顺序是多么的重要. 关于这个问题,其实网上已经有一些介绍,但是我觉得并 ...
随机推荐
- NULLIF(EXPR1,EXPR2)
--NULLIF(EXPR1,EXPR2):给定两个参数EXPR1和EXPR2,如果两个参数相等,则返回NULL:否则就返回第一个参数.
- docker复制文件到宿主机
从主机复制到容器 sudo docker cp host_path containerID:container_path 从容器复制到主机 sudo docker cp containerID:con ...
- ElasticSearch(十一):Spring Data ElasticSearch 的使用(一)
1.环境准备 我本地使用的环境为: 虚拟机版本:Centos 7.3 两台 IP 分别为:192.168.56.12, 192.168.56.13 Elasticsearch版本:6.4.0 ( ...
- Python数据结构汇总
Python数据结构汇总 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.线性数据结构 1>.列表(List) 在内存空间中是连续地址,查询速度快,修改也快,但不利于频繁新 ...
- unicode转换为中文
unicode转换为中文 \u5f53\u5730\u65f6\u95f42019\u5e747\u670813\u65e5\uff0c\u82f1\u56fd\u8d1d\u5fb7\u798f\u ...
- Proxmox初步了解
Proxmox不分主从,所有节点同步信息 创建集群 pvecm(可通过web界面创建.添加至集群) pvecm create cluster01 pvecm status 添加节点 pvecm add ...
- 《Maven在Java项目开发中的应用》论文笔记(十七)
标题:Maven在Java项目开发中的应用 一.基本信息 时间:2019 来源:山西农业大学 关键词:Maven:Java Web:仓库:开发人员:极限编程; 二.研究内容 1.Maven 基本原理概 ...
- EasyUI之dataGrid的行内编辑
$(function () { var datagrid; //定义全局变量datagrid var editRow = undefined; //定义全局变量:当前编辑的行 datagrid = T ...
- invoke和begininvoke 区别
一直对invoke和begininvoke的使用和概念比较混乱,这两天看了些资料,对这两个的用法和原理有了些新的认识和理解. 首先说下,invoke和begininvoke的使用有两种情况: 1. c ...
- EventWaitHandle 第一课
本篇通过一个列子使用EventWaitHandle实现两个线程的同步.请参看下面的列子. using System; using System.Collections.Generic; using S ...