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

一、DispatcherServlet是什么

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

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

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

graph TDA[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:视图 将模型数据通过页面展现给用户