DispatcherServlet 实质上是一个Servlet
,所以遵循 Servlet 的生命周期
。所以宏观上是 Servlet 生命周期来进行调度。
一、DispatcherServlet是什么
DispatcherServlet
: 前端控制器, 对立解决申请和响应,整个流程管制的核心,由它调用其它组件解决用户的申请,实质上是一个 Servlet
(初始化->运行->销毁),所以遵循 Servlet 的生命周期
。所以宏观上是 Servlet 生命周期来进行调度。既然是Servlet那么就依照Servlet生命周期去剖析源码就好了。
二、DispatcherServlet的继承构造(重要)
IDEA中快捷键Ctrl+Shift+Alt+U
可查看继承图
从上图中能够看到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:
视图
将模型数据通过页面展现给用户