乐趣区

关于springboot:DispatcherServlet初始化过程及源码分析

DispatcherServlet 实质上是一个 Servlet,所以遵循 Servlet 的 生命周期。所以宏观上是 Servlet 生命周期来进行调度。

一、DispatcherServlet 是什么

DispatcherServlet: 前端控制器, 对立解决申请和响应,整个流程管制的核心,由它调用其它组件解决用户的申请, 实质上是一个 Servlet(初始化 -> 运行 -> 销毁),所以遵循 Servlet 的 生命周期。所以宏观上是 Servlet 生命周期来进行调度。既然是 Servlet 那么就依照 Servlet 生命周期去剖析源码就好了。

二、DispatcherServlet 的继承构造(重要)

IDEA 中快捷键Ctrl+Shift+Alt+U 可查看继承图

graph TD
A[Servlet]
A==>B[GenericServlet]
B==>C[HttpServlet]
C==>D[HttpServletBean]
D==>E[FrameworkServlet]
E==>F[DispatcherServlet]

从上图中能够看到 DispatcherServlet 的顶层接口是Servlet

三、初始化流程具体介绍

能够应用 IDEA 工具, 跟着本文档步骤, 一起查看初始化流程

$\color{#F00}{尽管咱们看的是不同类中的调用过程, 如果通过继承或者实现放到同一个类中}$
$\color{#F00}{其实咱们就是在同一个类中来查看办法的调用。}$

1.Servlet 接口

从 Servlet 接口开始步步剖析, 在 Servlet 接口中存在下图中的 5 中形象办法。
快捷键: Alt+7

初始化办法则是 init(ServletConfig config) 办法

public interface Servlet {public void init(ServletConfig config) throws ServletException;    
}

2.GenericServlet 抽象类

public abstract class GenericServlet implements Servlet, ServletConfig,
        java.io.Serializable {
        
     // 重写 Servlet 中的初始化办法
     @Override
     public void init(ServletConfig config) throws ServletException {
         this.config = config;
         this.init();}
    
     // 重写的 init 办法中, 又调用空参的初始化办法
     public void init() throws ServletException {// NOOP by default}
}

重写 Servlet 接口中的初始化办法, 发现其又调用了空参的初始化办法, 那么接下来查看

3.HttpServle 抽象类

能够发现 HttpServle 没有重写 init 办法, 用的是父类中的办法, 那么咱们接着向下看

4.HttpServletBean 抽象类

HttpServletBean 中重写了 GenericServlet 中的 init 初始化办法, 那么证实 GenericServlet 中的空参 init 办法间接到这里了

而后查看 init 办法调用过程
也就是下图中的 initServletBean()办法

当初能够发现这次调用的是 initServletBean() 办法, 咱们来看子类是否对该办法进行了重写

5.FrameworkServlet 抽象类

能够看到上图中重写了 HttpServletBean 中的 initServletBean() 办法, 那么其中最重要的则是 initWebApplicationContext() 初始化 web 容器办法 , 接下来查看初始化办法都做了些什么如下图
与上图为一个办法内, 用来初始化和刷新 WebApplicationContext

ServletContext 是一个域对象。ServletContext 是在 web 工程部署启动的时候创立。在 web 工程进行的时候销毁。Servlet 上下文 一个 Web 工程只有一个。

刷新容器时都做了什么呢? 这个办法由子类实现

6.DispatcherServlet 类

次要是为了初始化 Spring MVC 中各个组件

FrameworkServlet 创立 WebApplicationContext 后,刷新容器,调用 onRefresh(wac),此办法在 DispatcherServlet 中进行了重写,调用了 initStrategies(context)办法 初始化各个组件

7. 初始化机会

  • Servlet 默认状况下, 当第一次拜访时实现初始化, 然而咱们能够看到流程比较复杂, 所以须要在启动时初始化(避免第一次拜访工夫过长)
  • 在 WebMvcProperties 的外部类 Servlet 中的定义,默认值是 -1,DispatcherServlet 会在申请来时执行一次初始化
private int loadOnStartup = -1;
  • 因而要想在创立容器的过程中初始化 DispatcherServlet,这须要设置该参数的值大于等于 0

    spring.mvc.servlet.load-on-startup=1

各组件的作用

  • DispatcherServlet:前端控制器,对立解决申请和响应,整个流程管制的核心,由它调用其它组件解决用户的申请
  • HandlerMapping:处理器映射器,依据申请的 url、method 等信息查找 Handler,即控制器办法
  • Handler:处理器,在 DispatcherServlet 的管制下 Handler 对具体的用户申请进行解决
  • HandlerAdapter:处理器适配器,通过 HandlerAdapter 对处理器(控制器办法)进行执行
  • ViewResolver:视图解析器,不须要工程师开发,由框架提供, 进行视图解析
  • View:视图 将模型数据通过页面展现给用户
退出移动版