Spring源码阅读——通过debug源码解析SpringMVC的流程

准备

简单搭建一个Spring MVC的项目,并写一个Controller,运行一个基本的请求转发

DispatcherServlet类图分析

Spring源码阅读——通过debug源码解析SpringMVC的流程_第1张图片
由此图我们可以分析的到,DispatcherServlet继承的FrameworkServlet实现了Spring中的ApplicationContextAware接口,然后又间接继承了HttpServlet。所以实质上是一个Servlet,(因为Spring MVC的切入口是Servlet,不同于Struts2,是Filter)。实现ApplicationContextAware,就可以拿到Spring的容器,就能获取Spring容器中的@Controller注解的类等。

断点调试

断点调试DispatcherServlet.class->onRefresh()->initStrategies(),来看下Spring MVC的初始化流程。

  • 第一个过程
    首先Spring已经把我们注解或者xml配置的bean装载进去了,
    在这个阶段,DispatcherServlet会从Spring容器中取出bean用于初始化HandlerMapping、HandlerAdapter、ViewResolver等放入DispatcherServlet对象中。断点init*方法即可看到其过程。
    HandlerMapping的作用是根据request找到对应的处理器Handler
    HandlerAdapter的作用是调用具体的方法对用户发来的请求来进行处理
    ViewResolver的作用是把Handler返回的逻辑视图名称解析为真正的视图View对象。
  • 第二个过程:
    请求映射与包装返回:
    在web.xml中,配置servlet的servlet-mapping的url为/,那么所有的请求都会进入这个DispatcherServlet中。
    在FrameworkServlet中,重写了service方法,当然这里只是做一些判断。
    (service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法)
    请求进入后,一次进入方法:
    service()->进入相应的doGet或doPost等->processRequest()->doService()->doDispatch()
    doDispatch这个方法是映射的核心,在其中,会去拿到request地址对应的mappedHandler,从而拿到对应的HandlerAdapter,然后HandlerAdapter执行handle方法(可以理解为去反射执行对应的Controller中的方法),返回ModelAndView。
    最后就是视图解析的过程了。

整理流程:

  • 用户发送请求至前端控制器DispatcherServlet。
  • DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  • 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  • DispatcherServlet调用HandlerAdapter处理器适配器。
  • HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
  • Controller执行完成返回ModelAndView。
  • HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
  • DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
  • ViewReslover解析后返回具体View。
  • DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
  • DispatcherServlet响应用户。
    Spring源码阅读——通过debug源码解析SpringMVC的流程_第2张图片

你可能感兴趣的:(Spring,Spring源码阅读)