zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    CentOS 6.9/7通过yum安装指定版本的Nginx
    Ubuntu 16.04安装uafred用于替代Alfred
    Alfred修改内置Terminal为iTerm
    CentOS 6.9下的iptables在本机用DNAT转发指定IP到内网IP无效的问题解决(127.0.0.1)
    Java在Service层异常封装
    Chrome无法播放m3u8格式的直播视频流的问题解决
    Caused by: java.net.UnknownHostException: localhost.localdomain: localhost.localdomain的问题解决
    macOS High Sierra 10.13正式版USB安装盘制作
    Maven打包排除某个资源或者目录
    mybatis实现变量定义,实现sql业务代码
  • 原文地址:https://www.cnblogs.com/hfultrastrong/p/10830517.html
Copyright © 2011-2022 走看看