DispatcherServlet本质上是一个Servlet,所以遵循Servlet的生命周期。所以宏观上来说,就是Servlet的生命周期来调度。1、什么是DispatcherServlet?DispatcherServlet:前端控制器,统一处理请求和响应。它是整个过程控制的中心。它调用其他组件来处理用户请求。它本质上是一个Servlet(初始化->运行->销毁),所以遵循Servlet的生命周期。所以宏观上来说,就是Servlet的生命周期来调度。既然是Servlet,那么根据Servlet的生命周期来分析源码就好了。2、DispatcherServlet的继承结构(重要)IDEA中快捷键Ctrl+Shift+Alt+U可以查看继承图图TDA[Servlet]A==>B[GenericServlet]B==>C[HttpServlet]C==>D[HttpServletBean]D==>E[FrameworkServlet]E==>F[DispatcherServlet]从上图可以看出DispatcherServlet的顶层接口是Servlet。3.详细描述了初始化过程。可以使用IDEA工具,按照这篇文档的步骤一起查看初始化过程$\color{#F00}{虽然我们是看在不同类中的调用过程,但是如果通过继承放在同一个类中或者implementation}$$\color{#F00}{其实我们在同一个类中查看方法调用。}$1。Servlet接口从Servlet接口开始一步步分析。Servlet接口中有下图中的5个抽象方法。快捷键:Alt+7初始化方法为init(ServletConfigconfig)方法publicinterfaceServlet{publicvoidinit(ServletConfigconfig)throwsServletException;}2.GenericServletabstractclasspublicabstractclassGenericServletimplementsServlet,ServletConfig,java.io.Serializable{//重写Servlet中的初始化方法@Overridepublicvoidinit(ServletConfigconfig)throwsServletException{this.config=config;这个。初始化();}//在重写的init方法中调用空参数的初始化方法publicvoidinit()throwsServletException{//默认为NOOP}}重写Servlet接口中的初始化方法,发现调用的是初始化方法空参数,然后查看3.HttpServle抽象类,发现HttpServle没有override写init方法,使用父类中的方法,再往下看4.HttpServletBean抽象类HttpServletBean重写了GenericServlet中的init初始化方法,则证明GenericServlet中的空参数init方法直接到这里再看init方法调用过程,就是下图中的initServletBean()方法。现在可以发现这次调用了initServletBean()方法。看看子类有没有重写方法。5.FrameworkServlet抽象类可以看到图中HttpServletBean中的initServletBean()方法被重写了,其中最重要的是初始化web容器的initWebApplicationContext()方法。接下来,检查初始化方法有什么作用?下图和上图是初始化和刷新WebApplicationContext的方法ServletContext是一个域对象ServletContext是在web项目部署开始时创建的。Web项目停止时销毁。一个Web项目只有一个Servlet上下文。刷新容器时你做了什么?该方法由子类实现。6、DispatcherServlet类主要是初始化SpringMVC中的各个组件FrameworkServlet。创建WebApplicationContext后,刷新容器并调用onRefresh(wac)。编写,调用initStrategies(context)方法初始化各个组件7.初始化时机Servlet默认在第一次访问时初始化,但是我们可以看到这个过程比较复杂,所以需要在启动时初始化(防止第一次访问时间过长)定义在WebMvcProperties的内部类Servlet中,默认值为-1,DispatcherServlet会在请求到来时进行一次初始化privateintloadOnStartup=-1;所以如果想在创建容器的过程中初始化DispatcherServlet,这个参数的值需要设置为大于等于0spring.mvc.servlet.load-on-startup=1的作用各组件DispatcherServlet:前端控制器,统一处理请求和响应,整个流程控制的中心,它调用其他组件处理用户RequestHandlerMapping:处理器映射器,根据请求的url、方法等信息找到Handler,即controller方法Handler:Processor,在DispatcherServlet的控制下,Handler处理具体的用户请求HandlerAdapter:Processoradapter,通过HandlerAdapter执行processor(controller方法)ViewResolver:视图解析器,不需要工程师开发,并且是框架提供的执行视图解析View:视图通过页面将模型数据展示给用户
