Spring Web MVC 主流程源码深度剖析与设计思想全解

概述

Spring Web MVC 是 Java 领域最经典的 Web 框架之一,被广泛应用于企业级应用开发。其核心思想是通过前置控制器 DispatcherServlet,将请求分发给不同的 Handler 进行处理,实现了请求与处理逻辑的解耦。本文将围绕 Spring Web MVC 的主流程,结合源码逐行解析,归纳设计思想,分析优缺点,辅以流程图和实际业务案例,深入理解其原理与架构演进。


名词解释

  • DispatcherServlet:Spring MVC 的前置控制器,所有请求都由其统一接收和分发。
  • HandlerMapping:用于查找与请求对应的处理器(Handler)。
  • HandlerAdapter:调用 Handler 的适配器,屏蔽不同类型 Handler 的差异。
  • ModelAndView:封装处理结果的数据和视图信息。
  • ViewResolver:视图解析器,根据逻辑视图名解析成具体视图对象。
  • HandlerInterceptor:拦截器,实现请求前后逻辑处理。

Spring Web MVC 简介与发展历史

Spring Web MVC(Model-View-Controller)自 2003 年 Spring Framework 初版发布起就作为核心模块之一,发展至今已成为 Java Web 应用事实标准。它以松耦合、强扩展性著称,支持多种视图技术(JSP、Freemarker、Thymeleaf、JSON、XML等),并不断演进以适应 RESTful、响应式等新趋势。


主流程结构总览

1. 主流程分解

Spring Web MVC 主流程如下:

  1. 客户端发送请求到 DispatcherServlet
  2. DispatcherServlet 调用 HandlerMapping 获取 Handler(Controller)
  3. 调用 HandlerInterceptor(前置处理)
  4. DispatcherServlet 调用 HandlerAdapter 执行 Handler
  5. Handler 返回 ModelAndView
  6. HandlerInterceptor(后置处理)
  7. DispatcherServlet 调用 ViewResolver 生成 View
  8. 渲染 View,响应客户端

2. 流程图(flowchart)

客户端请求
DispatcherServlet
HandlerMapping: 查找Handler
HandlerInterceptor: preHandle
HandlerAdapter: 调用Handler
ModelAndView
HandlerInterceptor: postHandle
ViewResolver: 解析View
View: 渲染
响应客户端

逐步源码剖析与设计思想

1. DispatcherServlet 核心流程

源码入口

位于 org.springframework.web.servlet.DispatcherServlet,其核心处理方法为 doDispatch(HttpServletRequest request, HttpServletResponse response)

核心源码与注释
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    ModelAndView mv = null;
    Exception dispatchException = null;

    try {
        // 1. 获取Handler
        mappedHandler = getHandler(processedRequest);
        if (mappedHandler == null) {
            noHandlerFound(processedRequest, response);
            return;
        }

        // 2. 获取HandlerAdapter
        HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

        // 3. 调用前置拦截器
        if (!mappedHandler.applyPreHandle(processedRequest, response)) {
            return;
        }

        // 4. 执行Handler(Controller)
        mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

        // 5. 调用后置拦截器
        mappedHandler.applyPostHandle(processedRequest, response, mv);
    }
    catch (Exception ex) {
        dispatchException = ex;
    }
    // 6. 处理ModelAndView,渲染视图
    processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}
设计思想与技巧
  • 前置控制器模式(Front Controller Pattern):所有请求统一入口,便于管理和扩展。
  • 责任链模式:拦截器链式调用,灵活插拔增强功能。
  • 适配器模式:HandlerAdapter 屏蔽不同 Handler 类型差异,增强扩展性。
优缺点分析
  • 优点:解耦请求与处理逻辑,易于扩展和维护;支持多种视图和 Handler 类型。
  • 缺点:主流程较长,学习曲线相对较高;过多拦截器可能影响性能。
速记口诀

“前置统一,链式拦截,适配多形,视图解耦。”


2. HandlerMapping

作用

根据请求 URL、方法等条件定位到具体的 Handler(Controller)。

典型实现
  • RequestMappingHandlerMapping:基于 @RequestMapping 注解的映射
  • SimpleUrlHandlerMapping:基于 URL 的映射
核心源码(以 RequestMappingHandlerMapping 为例)
@Override
protected HandlerMethod getHandlerInternal(HttpServletRequest request) throws Exception {
    // 1. 获取请求路径
    String lookupPath = getUrlPathHelper().getLookupPathForRequest(request);

    // 2. 匹配HandlerMethod
    HandlerMethod handlerMethod = lookupHandlerMethod(lookupPath, request);

    return handlerMethod;
}
技巧
  • 基于注解的路径、方法、参数等多条件路由,灵活支持 RESTful。

3. HandlerAdapter

作用

适配不同类型的 Handler,统一调用接口。

典型实现
  • RequestMappingHandlerAdapter:适配 @RequestMapping 方法
  • SimpleControllerHandlerAdapter:适配 Controller 接口
核心源码(以 RequestMappingHandlerAdapter 为例)
@Override
public final ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {
    return handleInternal(request, response, (HandlerMethod) handler);
}

4. HandlerInterceptor

作用

实现请求的前置、后置、完成等环节的拦截处理。

核心方法
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
常用场景
  • 权限校验、日志记录、性能监控等。

5. ViewResolver 与视图渲染

作用

根据逻辑视图名解析为具体视图对象,支持 JSP、Freemarker、Thymeleaf 等多种模板。

核心实现
  • InternalResourceViewResolver:用于 JSP、Servlet
  • FreeMarkerViewResolver:用于 Freemarker
  • MappingJackson2JsonView:用于 JSON 数据

主流程时序图(sequenceDiagram)

客户端 DispatcherServlet HandlerMapping HandlerAdapter HandlerInterceptor ViewResolver View HTTP 请求 获取 Handler 返回 Handler preHandle 执行 Handler 返回 ModelAndView postHandle 解析视图 返回 View 渲染 渲染结果 HTTP 响应 客户端 DispatcherServlet HandlerMapping HandlerAdapter HandlerInterceptor ViewResolver View

状态转换图(stateDiagram-v2)

请求接收
查找Handler
前置拦截
调用Handler
后置拦截
视图解析
视图渲染
响应输出

实际业务场景举例

1. RESTful API

  • 路径映射:GET /users/{id} 映射到 UserController#getUser(Long id)
  • HandlerMapping 根据 URL、HTTP 方法等精确匹配
  • HandlerAdapter 自动调用方法并参数绑定
  • ViewResolver 自动渲染为 JSON

2. 权限拦截

  • 实现 HandlerInterceptor,在 preHandle 阶段校验登录态或角色权限,不通过则中断流程。

调试和优化技巧

  • 查看 HandlerMapping/actuator/mappings 可查看所有映射关系。
  • 启用日志:配置 org.springframework.web.servlet 日志级别为 DEBUG,分析请求分发细节。
  • 拦截器性能监控:记录 preHandle/postHandle/afterCompletion 的耗时,定位瓶颈。
  • 缓存 ViewResolver 结果:减少频繁解析带来的性能损耗。

与其他技术栈集成与高阶应用

  • Spring Security:拦截器链集成,实现认证和授权。
  • Spring Boot:自动装配 DispatcherServlet 和核心 Bean,简化配置。
  • Spring Data REST:自动生成 RESTful API,直接集成 HandlerMapping、HandlerAdapter。
  • 响应式集成:Spring 5+ 支持 WebFlux,采用异步非阻塞模型,核心思想与 MVC 相通但实现不同。

底层实现与架构演进

  • 早期版本:基于 HandlerMapping、HandlerAdapter 的接口契约,支持传统 Controller。
  • 注解驱动:Spring 2.5+ 引入 @RequestMapping、@Controller,极大提升开发效率。
  • RESTful 与多媒体类型:支持 ContentNegotiation、消息转换器(MessageConverter)。
  • 响应式支持:Spring WebFlux 采用响应式流式处理,DispatcherHandler 取代 DispatcherServlet。

速记口诀总结

“前置统一,链式拦截,适配多形,视图解耦,注解驱动,扩展灵活。”


全文总结与系统认知

Spring Web MVC 以 DispatcherServlet 为核心,采用前置控制器、责任链、适配器等经典设计模式,实现了请求与处理、数据与视图的高度解耦。其主流程清晰、扩展性强,能高效支撑多样化 Web 需求。通过注解驱动、拦截器机制和多视图支持,极大提升了开发效率与系统可维护性。掌握其主流程与源码机制,不仅有助于排查问题、性能优化,更能为架构设计与技术选型提供坚实基础。


参考资料

  1. Spring Web MVC 官方文档
  2. Spring 源码 GitHub
  3. Baeldung Spring MVC Guide
  4. Spring Security Reference

Mermaid 图表结构优化说明

  • flowchart:适合描述整体主流程,突出顺序与分支。
  • sequenceDiagram:适合展现请求在不同组件间的时序调用关系,便于理解交互细节。
  • stateDiagram-v2:适合突出请求生命周期的各个状态及其转换,便于把握全局脉络。

知其然,更知其所以然。
通过源码逐行剖析、设计思想归纳、典型场景演示与高级架构解构,全面掌握 Spring Web MVC 的主流程与底层原理,为你的 Java Web 技术栈打下坚实基础!

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐