Spring Web MVC 主流程源码深度剖析与设计思想全解
Spring Web MVC(Model-View-Controller)自 2003 年 Spring Framework 初版发布起就作为核心模块之一,发展至今已成为 Java Web 应用事实标准。它以松耦合、强扩展性著称,支持多种视图技术(JSP、Freemarker、Thymeleaf、JSON、XML等),并不断演进以适应 RESTful、响应式等新趋势。“前置统一,链式拦截,适配多形
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 主流程如下:
- 客户端发送请求到 DispatcherServlet
- DispatcherServlet 调用 HandlerMapping 获取 Handler(Controller)
- 调用 HandlerInterceptor(前置处理)
- DispatcherServlet 调用 HandlerAdapter 执行 Handler
- Handler 返回 ModelAndView
- HandlerInterceptor(后置处理)
- DispatcherServlet 调用 ViewResolver 生成 View
- 渲染 View,响应客户端
2. 流程图(flowchart)
逐步源码剖析与设计思想
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、ServletFreeMarkerViewResolver:用于 FreemarkerMappingJackson2JsonView:用于 JSON 数据
主流程时序图(sequenceDiagram)
状态转换图(stateDiagram-v2)
实际业务场景举例
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 需求。通过注解驱动、拦截器机制和多视图支持,极大提升了开发效率与系统可维护性。掌握其主流程与源码机制,不仅有助于排查问题、性能优化,更能为架构设计与技术选型提供坚实基础。
参考资料
Mermaid 图表结构优化说明
- flowchart:适合描述整体主流程,突出顺序与分支。
- sequenceDiagram:适合展现请求在不同组件间的时序调用关系,便于理解交互细节。
- stateDiagram-v2:适合突出请求生命周期的各个状态及其转换,便于把握全局脉络。
知其然,更知其所以然。
通过源码逐行剖析、设计思想归纳、典型场景演示与高级架构解构,全面掌握 Spring Web MVC 的主流程与底层原理,为你的 Java Web 技术栈打下坚实基础!
更多推荐

所有评论(0)