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 被加载顺序的更多相关文章

  1. web工程中web.xml元素加载顺序以及配置实例

    简介 web.xml是web工程的配置文件,容器加载web工程时,会首先从WEB-INF中查询web.xml,并加载其中的配置信息,可以将web.xml认为是web工程的入口. web.xml中包含有 ...

  2. 3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)

    1.外部配置加载顺序 SpringBoot也可以从以下位置加载配置: 优先级从高到低 高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置  1.命令行参数 所有的配置都可以在命令行上进行指定 ...

  3. SpringMvc项目加载顺序及上下文小结

    前言: 使用springMvc已经三年了,但是内部原来一直不太了解,看到ServletConetxt和ApplicationContext头就大,趁着这几天学习,正好学习下相关的知识. 1.Servl ...

  4. web.xml加载顺序

    一 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Ser ...

  5. web.xml文件加载顺序

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

  6. web.xml 中的listener、 filter、servlet 加载顺序及其详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  7. css样式加载顺序及覆盖顺序深入理解

    注:内容转载 很多的新手朋友们对css样式加载顺序和覆盖顺序的理解有所偏差,下面用示例为大家详细的介绍下,感兴趣的朋友不要错过 { height: 100%; width: 200; position ...

  8. Java---类加载机制,构造方法,静态变量,(静态)代码块,父类,变量加载顺序

    直接上代码: 代码1: public class ConstroctTest { private static ConstroctTest test = new ConstroctTest(); // ...

  9. DOM加载顺序

    最近一直在困扰dom的加载顺序问题,经常会遇到以为绑定好的事件不响应等情况,一头雾水,直到请教了周围的同事,才发现了解dom的加载顺序是多么的重要. 关于这个问题,其实网上已经有一些介绍,但是我觉得并 ...

随机推荐

  1. Java开发环境之Solr

    查看更多Java开发环境配置,请点击<Java开发环境配置大全> 玖章:Solr安装教程 1)官网下载Solr安装包 http://lucene.apache.org/solr/downl ...

  2. 查看kafka版本

    kafka没有提供version命令,不确定是否有方便的方法,但你可以进入kafka/libs文件夹. 或: find / -name \*kafka_\* | head -1 | grep -o ' ...

  3. Redis开发与运维学习笔记

    <Redis开发与运维>读书笔记   一.初始Redis 1.Redis特性与优点 速度快.redis所有数据都存放于内存:是用C语言实现,更加贴近硬件:使用了单线程架构,避免了多线程竞争 ...

  4. 关于srping的AOP事务管理问题,自定义切面是否导致事务控制失效

    applicationContext.xml: <!-- 方法调用时间记录 --> <bean id="methodExecuteTime" class=&quo ...

  5. Python练习题——用列表的方法输出杨辉三角

    def main(): num = int(input('请输入行数: ')) yh = [[]] * num #创建num行空列表 for row in range(len(yh)): #遍历每一行 ...

  6. 学习Spring-Data-Jpa(十四)---自定义Repository

    有些时候,我们需要自定义Repository实现一些特殊的业务场景. 1.自定义单个Repository 1.1.首先提供一个片段接口和实现(接口的实现默认要使用Impl为后缀,实现本身不依赖spri ...

  7. 基于C+OpenCV4.0的LineSegmentDetector算法实现

    简单记录LSD算法的实现过程,当做备忘录用,如有问题欢迎指出和讨论 LSD的基本实现流程是计算出图像的梯度和场方向,然后对梯度进行排序,然后从大到小进行区域增长,之后对增长得到的区域求最小外接矩形,如 ...

  8. PJ8搜索

    1,P1036 2,枚举子集 3,P1378 我觉得先需要一个排列,而且是n中取n的那种. 然后按照每个顺序进行模拟扩展,得出最大面积(体积?) 最后就更新最大值没什么说的. 1,啥是搜索,主要是一个 ...

  9. Guava com.google.common.base.Stopwatch Spark程序在yarn中 MethodNotFound

    今天在公司提交一个Spark 读取hive中的数据,写入JanusGraph 的app,自己本地调试没有问题,放入环境中提交到yarn 中时,发现app 跑不起. yarn 中日志,也比较明显,app ...

  10. ztree异步加载---------补发周日内容

    上周六老师要求和大三的进行JAVA知识交流,总体来说就是给大三学长做的东西打分,然后大三学长再教我们如果构建ztree.毕竟第一次接触ztree,所以有很多不了解,但通过周六日努力,还是做出来了.现在 ...