Spring MVC 是 Spring 框架中的一个模块,用于构建基于 MVC(Model-View-Controller)架构的 Web 应用。
对 Spring MVC 的系统性分析,涵盖主要组件、核心流程及关键类的作用。
🧱 一、整体架构图
Spring MVC 的请求处理流程如下:
客户端 → DispatcherServlet → HandlerMapping → Controller
↓
ModelAndView ← 返回
↓
ViewResolver → View
↓
渲染 Model 数据
↓
返回响应给客户端
其中最核心的是 DispatcherServlet
,它是整个框架的前端控制器。
📦 二、核心组件及对应类
组件 | 类名 | 功能 |
---|---|---|
前端控制器 | DispatcherServlet | 控制所有请求入口,协调各组件 |
处理器映射 | HandlerMapping 接口(如 RequestMappingHandlerMapping ) | 根据 URL 找到对应的 Controller 方法 |
处理器适配器 | HandlerAdapter 接口(如 RequestMappingHandlerAdapter ) | 调用 Controller 方法并处理参数/返回值 |
视图解析器 | ViewResolver 接口(如 InternalResourceViewResolver ) | 解析逻辑视图名为实际视图对象 |
异常处理器 | HandlerExceptionResolver 接口(如 DefaultHandlerExceptionResolver ) | 处理 Controller 抛出的异常 |
区域解析器 | LocaleResolver | 解析客户端区域设置 |
主题解析器 | ThemeResolver | 管理主题样式 |
Multipart 解析器 | MultipartResolver | 处理文件上传 |
🔍 三、核心流程源码分析
1. 请求入口:DispatcherServlet.doService()
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 设置上下文属性,包括 WebApplicationContext、localeResolver、themeResolver 等
...
try {
doDispatch(request, response); // 核心调度方法
} finally {
...
}
}
2. 核心调度逻辑:doDispatch(HttpServletRequest request, HttpServletResponse response)
这是整个请求处理的核心方法,逻辑如下:
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
// 1. 文件上传处理
if (this.multipartResolver != null && this.multipartResolver.isMultipart(request)) {
processedRequest = this.multipartResolver.resolveMultipart(request);
}
// 2. 获取 Handler(Controller 方法)
mappedHandler = getHandler(processedRequest);
// 3. 获取 HandlerAdapter(适配不同类型的 Controller)
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 4. 调用 preHandle 拦截器
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
// 5. 实际调用 Controller 方法
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
// 6. 处理返回的 ModelAndView
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}
3. HandlerMapping 的实现类:RequestMappingHandlerMapping
负责将 URL 映射到具体的 Controller 方法上。
public class RequestMappingHandlerMapping extends AbstractHandlerMethodMapping<String> {
// 注册所有的 @RequestMapping 注解的方法
protected void registerHandlerMethods(Object handler, Class<?> handlerType) {
...
}
// 根据 URL 查找 HandlerMethod
public HandlerMethod getHandlerInternal(HttpServletRequest request) {
...
}
}
4. HandlerAdapter 的实现类:RequestMappingHandlerAdapter
负责调用 Controller 方法,并处理参数绑定与返回值处理。
public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter {
private List<HandlerMethodArgumentResolver> argumentResolvers; // 参数解析器链
private List<HandlerMethodReturnValueHandler> returnValueHandlers; // 返回值处理器链
public final ModelAndView handleInternal(HttpServletRequest request,
HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
// 参数解析
ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
// 调用 controller 方法
Object returnValue = invocableMethod.invokeForRequest(webRequest, mavContainer, providedArgs);
// 处理返回值
this.returnValueHandlers.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
}
}
5. 参数绑定机制(@RequestParam
, @RequestBody
等)
Spring MVC 使用 HandlerMethodArgumentResolver
来支持各种参数类型:
参数注解 | 对应的 Resolver |
---|---|
@RequestParam | RequestParamMethodArgumentResolver |
@PathVariable | PathVariableMethodArgumentResolver |
@RequestBody | RequestResponseBodyMethodProcessor |
@ModelAttribute | ModelAttributeMethodProcessor |
6. 返回值处理(@ResponseBody
, ModelAndView
)
使用 HandlerMethodReturnValueHandler
处理 Controller 返回的数据:
返回类型 | 对应的 Handler |
---|---|
ModelAndView | ModelAndViewMethodReturnValueHandler |
void | VoidReturnMethodHandler |
@ResponseBody | RequestResponseBodyMethodProcessor |
String (视图名) | ViewNameMethodReturnValueHandler |
7. 异常处理(@ExceptionHandler
, @ControllerAdvice
)
Spring MVC 提供了灵活的异常处理机制:
@ExceptionHandler
:在 Controller 内部处理异常。@ControllerAdvice
:全局异常处理器。HandlerExceptionResolver
接口是底层抽象。
常见实现:
SimpleMappingExceptionResolver
DefaultHandlerExceptionResolver
ExceptionHandlerExceptionResolver
(处理@ExceptionHandler
)
🧪 四、调试
1. 启动时加载配置
- 关注
WebApplicationInitializer
和@EnableWebMvc
的作用。 DispatcherServlet
的初始化过程(onRefresh()
方法中加载各个组件)。
2. 调试入口点
- 断点设置在
DispatcherServlet.doDispatch()
方法。 - 追踪
HandlerMapping.getHandler()
和HandlerAdapter.handle()
。
3. 使用 IDE 分析依赖关系
- IntelliJ IDEA 中可使用 “Find Usages”、“Call Hierarchy” 分析类之间的调用关系。
- 利用 “Structure” 面板查看类结构。
📚 五、推荐阅读源码路径
Spring MVC 源码位于 Spring Framework 项目中:
spring-webmvc/src/main/java/org/springframework/web/servlet/
重点类列表:
类名 | 描述 |
---|---|
DispatcherServlet | 主控类 |
HandlerMapping / AbstractHandlerMapping | 映射接口与抽象类 |
HandlerAdapter / AbstractHandlerMethodAdapter | 适配器接口与抽象类 |
RequestMappingHandlerMapping | 支持 @RequestMapping 的 HandlerMapping |
RequestMappingHandlerAdapter | 支持 @RequestMapping 的 HandlerAdapter |
HandlerMethodArgumentResolver | 参数解析接口 |
HandlerMethodReturnValueHandler | 返回值处理接口 |
ViewResolver / InternalResourceViewResolver | 视图解析相关 |
HandlerExceptionResolver / ExceptionHandlerExceptionResolver | 异常处理相关 |
✅ 六、总结
学习要点 | 内容 |
---|---|
入口 | DispatcherServlet 是核心控制中心 |
流程 | 请求 → HandlerMapping → HandlerAdapter → Controller → 返回值处理 → View 渲染 |
参数绑定 | 使用 HandlerMethodArgumentResolver 实现自动绑定 |
返回值处理 | 使用 HandlerMethodReturnValueHandler 处理返回结果 |
异常处理 | 支持局部和全局异常处理机制 |
可扩展性 | 各组件可通过配置或自定义实现替换增强功能 |