Spring MVC架构与DispatcherServlet

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
HttpMessageConvertersAutoConfigurationJackson、Gson 等 JSON 转换器

五、核心组件默认实现一览(2025 年最新)

组件Spring Boot 3.x 默认实现
HandlerMappingRequestMappingHandlerMapping + RouterFunctionMapping(WebFlux)
HandlerAdapter RequestMappingHandlerAdapter + HttpRequestHandlerAdapter + SimpleControllerHandlerAdapter
HandlerExceptionResolver ExceptionHandlerExceptionResolver(@ControllerAdvice)→ ResponseStatusExceptionResolver → DefaultHandlerExceptionResolver
ViewResolver ContentNegotiatingViewResolver(决定返回 JSON 还是 HTML)+ ThymeleafViewResolver / InternalResourceViewResolver
HttpMessageConverter MappingJackson2HttpMessageConverter(Jackson)等 15 个左右

六、面试/实战高频问题

  1. 为什么说 DispatcherServlet 是前端控制器模式?
    所有请求统一入口,内部再分发,符合 Front Controller 设计模式。
  2. @Controller 和 @RestController 区别?
    @RestController = @Controller + @ResponseBody,所有方法默认返回 JSON。
  3. Spring MVC 如何解决乱码?
    Spring Boot 已经内置 CharacterEncodingFilter,强制 UTF-8。
  4. 怎么自定义拦截器?
@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");
    }
}
  1. @ExceptionHandler 和 @ControllerAdvice 的执行顺序?
    优先找当前 Controller 的 @ExceptionHandler → 再找所有 @ControllerAdvice。

七、一张图记住 Spring MVC 流程(建议保存

请求 → DispatcherServlet
        ↓
   HandlerMapping → 找到 Controller 方法
        ↓
   HandlerAdapter → 参数解析 → 执行方法 → 返回值处理
        ↓
   ViewResolver + View → 渲染响应
        ↓
响应返回

掌握了这张图 + 9 大组件 + DispatcherServlet 的 doDispatch 源码,你基本就通关 Spring MVC 了。

需要我把 DispatcherServlet 的 doDispatch() 核心源码贴出来逐行讲解吗?还是你想看 Spring Boot 3 中如何完全接管 WebMvcConfigurer 实现自定义?继续问我!

文章已创建 3070

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部