跳转至

SpringMVC 执行流程

结论

SpringMVC 围绕 DispatcherServlet 设计,本质是一个前端控制器(Front Controller)。完整流程:

请求 -> DispatcherServlet -> HandlerMapping -> HandlerExecutionChain
     -> HandlerAdapter -> Controller -> ModelAndView
     -> ViewResolver -> View 渲染 -> 响应

详细步骤

1. 请求到达 DispatcherServlet

所有请求统一进入 DispatcherServlet,它是前端控制器。

2. DispatcherServlet 查询 HandlerMapping

HandlerMapping 根据请求 URL 找到对应的 HandlerMethod(即 @RequestMapping 标注的方法),并生成 HandlerExecutionChain(包含拦截器链)。

常见实现:RequestMappingHandlerMapping

3. 执行拦截器 preHandle

依次执行 HandlerInterceptor#preHandle,返回 false 则中断。

4. DispatcherServlet 通过 HandlerAdapter 调用 Controller

HandlerAdapter 屏蔽不同类型 Controller 的调用差异(注解控制器、HttpRequestHandler等)。

5. 调用方法并处理参数解析

HandlerAdapter(实际是 RequestMappingHandlerAdapter):

  • HandlerMethodArgumentResolver 解析参数(@RequestParam@RequestBody@PathVariable 等)。
  • 调用 Controller 方法。
  • HandlerMethodReturnValueHandler 处理返回值(@ResponseBodyRequestResponseBodyMethodProcessor,用 HttpMessageConverter 写 JSON)。

6. Controller 返回 ModelAndView

如果是 @ResponseBody,直接写回 Response,不经过 View。

7. 执行拦截器 postHandle

8. ViewResolver 解析视图

把逻辑视图名解析为具体 View(如 Thymeleaf、JSP)。

9. View 渲染

把 Model 数据填充进模板,输出 HTML。

10. 执行拦截器 afterCompletion

流程图

sequenceDiagram
    participant Client
    participant DS as DispatcherServlet
    participant HM as HandlerMapping
    participant HA as HandlerAdapter
    participant C as Controller
    participant VR as ViewResolver
    participant V as View

    Client->>DS: HTTP 请求
    DS->>HM: 查找 Handler
    HM-->>DS: HandlerExecutionChain
    DS->>HA: 适配调用
    HA->>C: 反射调用方法
    C-->>HA: ModelAndView
    HA-->>DS: ModelAndView
    DS->>VR: 解析视图
    VR-->>DS: View
    DS->>V: 渲染
    V-->>Client: HTTP 响应

高频追问

  • @ResponseBody 为什么不经过 View?因为 RequestResponseBodyMethodProcessor 直接用 MappingJackson2HttpMessageConverter 写 JSON 到 OutputStream。
  • 拦截器 vs Filter:Filter 是 Servlet 规范,在 DispatcherServlet 之前;Interceptor 是 SpringMVC 概念,只对 Controller 生效。