主题
概念卡片: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拦截器三个回调
| 回调 | 时机 | 方向 |
|---|---|---|
preHandle | Handler 执行前 | 正向(先注册先执行) |
postHandle | Handler 执行后、视图渲染前 | 逆向 |
afterCompletion | 视图渲染后 | 逆向(总会执行,即使异常) |
interceptorIndex记录已执行 preHandle 的拦截器索引,异常时用于精确控制 afterCompletion 的逆向执行。
关键组件职责
| 组件 | 谁提供 | 职责 |
|---|---|---|
| DispatcherServlet | 框架 | 前端控制器,流程中心 |
| HandlerMapping | 框架 | 按 url/method 找 Handler |
| Handler | 开发者 | 处理具体请求 |
| HandlerAdapter | 框架 | 适配执行 Handler |
| ViewResolver | 框架 | 解析视图(Thymeleaf/InternalResource/Redirect) |
常见误解(避坑)
- ❌ "请求直接找 Controller"。→ 中间隔了 HandlerMapping(找 Handler+拦截器)和 HandlerAdapter(适配执行),Handler 不一定是 Controller,适配器模式解耦了调用。
- ❌ "拦截器 postHandle 一定执行"。→ 只有 preHandle 返回 true 且 Handler 正常返回才执行 postHandle;但 afterCompletion 总会执行(finally 语义)。
- ❌ "参数绑定只是取 request 参数"。→ 还包含类型转换(String→Integer)、格式化(日期)、校验(存入 BindingResult/Error)、HttpMessageConverter(JSON↔对象)四件事。
- ❌ "DispatcherServlet 就是普通 Servlet"。→ 它是 Servlet(遵循 Servlet 生命周期),但做了大量扩展:双 WebApplicationContext、九组件初始化、请求分发。
关联
- 原始资料:✅【13】SpringMVC执行流程
- 总览:Spring技术栈总览
- 域地图:A00-百科/Java后端/Java后端