Spring MVC 核心架构与 DispatcherServlet 全解析(2025 版)
Spring MVC 是目前 Java 后端最主流的 Web 框架,虽然现在很多人用 Spring WebFlux 做响应式,但 90% 以上的企业项目仍然是经典的 Spring MVC(基于 Servlet)。彻底搞懂 DispatcherServlet 和整个请求处理流程,是成为 Spring 高手的必经之路。
一、Spring MVC 整体架构图(经典九大组件)
浏览器请求
↓
DispatcherServlet(前端控制器) ←——— Spring MVC 的核心、心脏、灵魂
↓
1. HandlerMapping → 找谁来处理请求(@RequestMapping)
↓2. HandlerAdapter → 真正调用你的 Controller 方法
↓3. HandlerExceptionResolver → 异常怎么办(@ControllerAdvice)
↓4. ViewResolver → "hello" → 变成 /WEB-INF/views/hello.jsp 或 Thymeleaf 模板
↓5. View → 真正渲染返回给浏览器
↓6. LocaleResolver + LocaleContextResolver → 国际化 i18n
↓7. ThemeResolver → 主题/皮肤
↓8. MultipartResolver → 文件上传解析
↓9. FlashMapManager → Redirect 后传参(redirect_attributes)
↓
返回 HTML / JSON / XML / 文件 等
这 9 大组件全部都是接口,DispatcherServlet 内部默认就配好了实现,99% 的项目不需要自己去实现。
二、DispatcherServlet 是怎么工作的?(一次请求的 9 大步骤)
1. 用户发送请求 → Tomcat → DispatcherServlet.doDispatch()
2. DispatcherServlet 拿着 request 去所有 HandlerMapping 问:
“你们谁能处理这个请求?”(按顺序问,通常 MappedInterceptor + RequestMappingHandlerMapping 能处理)
3. 拿到 HandlerExecutionChain(Controller 方法 + 拦截器链)
4. DispatcherServlet 再去所有 HandlerAdapter 问:
“你们谁能执行这个 Handler?”(通常 RequestMappingHandlerAdapter 举手)
5. HandlerAdapter 执行前置拦截器 → preHandle()
6. HandlerAdapter 真正调用你的 Controller 方法
├─ 参数解析(HandlerMethodArgumentResolver 30+ 种:@RequestBody、@PathVariable、@ModelAttribute...)
├─ 数据绑定 + 校验(@Valid、BindingResult)
├─ @ResponseBody 的话走消息转换器 HttpMessageConverter(Jackson、Gson、Fastjson...)
└─ 返回普通 String / ModelAndView 的话走视图解析
7. HandlerAdapter 执行后置拦截器 → postHandle()
8. DispatcherServlet 进行视图解析(ViewResolver → View → render()
9. 最终执行完成拦截器 → afterCompletion()(不管异常与否都会执行,常用于清理资源)
10. response 返回给浏览器
三、DispatcherServlet 初始化过程(9 大组件到底在哪初始化的?)
// 容器启动时执行
DispatcherServlet.initStrategies(ApplicationContext context)
{
initMultipartResolver(context); // 文件上传
initLocaleResolver(context); // 国际化
initThemeResolver(context); // 主题
initHandlerMappings(context); // @RequestMapping 等
initHandlerAdapters(context); // 执行 Controller
initHandlerExceptionResolvers(context); // @ControllerAdvice
initRequestToViewNameTranslator(context); // 直接用方法名当视图名
initViewResolvers(context); // Thymeleaf、Freemarker、JSP
initFlashMapManager(context); // redirect 参数
}
Spring Boot 都自动帮你配好了,你几乎看不到这些代码。
四、Spring Boot 中 DispatcherServlet 的关键自动配置类(重点)
| 配置类 | 作用 |
|---|---|
| DispatcherServletAutoConfiguration | 注册 DispatcherServlet 这个 Bean 并注册 Servlet |
| DispatcherServletRegistrationBean | 把 DispatcherServlet 注册到 Tomcat,路径为 / |
| WebMvcAutoConfiguration | 开启 @EnableWebMvc 所有功能(ViewResolver、Converter…) |
| ErrorMvcAutoConfiguration | 错误页面 /BasicErrorAttributes |
| HttpMessageConvertersAutoConfiguration | Jackson、Gson 等 JSON 转换器 |
五、核心组件默认实现一览(2025 年最新)
| 组件 | Spring Boot 3.x 默认实现 |
|---|---|
| HandlerMapping | RequestMappingHandlerMapping + RouterFunctionMapping(WebFlux) |
| HandlerAdapter RequestMappingHandlerAdapter + HttpRequestHandlerAdapter + SimpleControllerHandlerAdapter | |
| HandlerExceptionResolver ExceptionHandlerExceptionResolver(@ControllerAdvice)→ ResponseStatusExceptionResolver → DefaultHandlerExceptionResolver | |
| ViewResolver ContentNegotiatingViewResolver(决定返回 JSON 还是 HTML)+ ThymeleafViewResolver / InternalResourceViewResolver | |
| HttpMessageConverter MappingJackson2HttpMessageConverter(Jackson)等 15 个左右 |
六、面试/实战高频问题
- 为什么说 DispatcherServlet 是前端控制器模式?
所有请求统一入口,内部再分发,符合 Front Controller 设计模式。 - @Controller 和 @RestController 区别?
@RestController = @Controller + @ResponseBody,所有方法默认返回 JSON。 - Spring MVC 如何解决乱码?
Spring Boot 已经内置 CharacterEncodingFilter,强制 UTF-8。 - 怎么自定义拦截器?
@Component
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(...) { ... }
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
}
}
- @ExceptionHandler 和 @ControllerAdvice 的执行顺序?
优先找当前 Controller 的 @ExceptionHandler → 再找所有 @ControllerAdvice。
七、一张图记住 Spring MVC 流程(建议保存
请求 → DispatcherServlet
↓
HandlerMapping → 找到 Controller 方法
↓
HandlerAdapter → 参数解析 → 执行方法 → 返回值处理
↓
ViewResolver + View → 渲染响应
↓
响应返回
掌握了这张图 + 9 大组件 + DispatcherServlet 的 doDispatch 源码,你基本就通关 Spring MVC 了。
需要我把 DispatcherServlet 的 doDispatch() 核心源码贴出来逐行讲解吗?还是你想看 Spring Boot 3 中如何完全接管 WebMvcConfigurer 实现自定义?继续问我!