Skip to content

概念卡片:SpringMVC 执行流程

一句话机制

SpringMVC 围绕 DispatcherServlet(前端控制器)运转:请求先经 HandlerMapping 找到 Handler 和拦截器(封装成 HandlerExecutionChain),再交给 HandlerAdapter 执行,返回 ModelAndView,最后 ViewResolver 解析并渲染视图。 拦截器按 preHandle(正向)→ postHandle(逆向)→ afterCompletion(逆向)三段执行。

九大组件(initStrategies)

DispatcherServlet 初始化时调用 initStrategies() 初始化九个组件:

java
initMultipartResolver();       // 文件上传解析器
initLocaleResolver();          // 国际化/本地化解析器
initThemeResolver();           // 主题解析器
initHandlerMappings();         // 处理器映射器(核心)
initHandlerAdapters();         // 处理器适配器(核心)
initHandlerExceptionResolvers();// 异常解析器
initRequestToViewNameTranslator();
initViewResolvers();           // 视图解析器(核心)
initFlashMapManager();         // 重定向数据传递

其中 HandlerMapping / HandlerAdapter / ViewResolver 是请求处理的关键三件。

执行流程(11 步)

1. 请求被 DispatcherServlet 捕获
2. 解析 URI,判断映射是否存在(不存在→查 default-servlet-handler,否则 404)
3. HandlerMapping 找到 Handler + 拦截器 → 返回 HandlerExecutionChain
4. 选择匹配的 HandlerAdapter
5. 执行拦截器 preHandle() 【正向】
6. 填充 Handler 入参(参数绑定/类型转换/格式化/校验,HttpMessageConverter 处理 JSON)
7. Handler 执行,返回 ModelAndView
8. 执行拦截器 postHandle() 【逆向】
9. 异常时执行 HandlerExceptionResolver 处理
10. ViewResolver 解析视图,渲染
11. 执行拦截器 afterCompletion() 【逆向】,返回客户端

源码核心链

FrameworkServlet.service()/doGet()/doPost()
  → processRequest()            // 绑定上下文、记录日志
    → doService()               // 设 request attribute
      → doDispatch()            // ★ 核心分发
        ├─ getHandler()         // HandlerMapping → HandlerExecutionChain
        ├─ getHandlerAdapter()  // 选适配器
        ├─ applyPreHandle()     // 拦截器 preHandle
        ├─ ha.handle()          // 执行 Controller,返回 ModelAndView
        ├─ applyPostHandle()    // 拦截器 postHandle
        └─ processDispatchResult()  // 异常处理 + 渲染视图
             └─ triggerAfterCompletion() // 拦截器 afterCompletion

拦截器三个回调

回调时机方向
preHandleHandler 执行前正向(先注册先执行)
postHandleHandler 执行后、视图渲染前逆向
afterCompletion视图渲染后逆向(总会执行,即使异常)

interceptorIndex 记录已执行 preHandle 的拦截器索引,异常时用于精确控制 afterCompletion 的逆向执行。

关键组件职责

组件谁提供职责
DispatcherServlet框架前端控制器,流程中心
HandlerMapping框架按 url/method 找 Handler
Handler开发者处理具体请求
HandlerAdapter框架适配执行 Handler
ViewResolver框架解析视图(Thymeleaf/InternalResource/Redirect)

常见误解(避坑)

  1. ❌ "请求直接找 Controller"。→ 中间隔了 HandlerMapping(找 Handler+拦截器)和 HandlerAdapter(适配执行),Handler 不一定是 Controller,适配器模式解耦了调用。
  2. ❌ "拦截器 postHandle 一定执行"。→ 只有 preHandle 返回 true 且 Handler 正常返回才执行 postHandle;但 afterCompletion 总会执行(finally 语义)。
  3. ❌ "参数绑定只是取 request 参数"。→ 还包含类型转换(String→Integer)、格式化(日期)、校验(存入 BindingResult/Error)、HttpMessageConverter(JSON↔对象)四件事。
  4. ❌ "DispatcherServlet 就是普通 Servlet"。→ 它是 Servlet(遵循 Servlet 生命周期),但做了大量扩展:双 WebApplicationContext、九组件初始化、请求分发。

关联

最近更新