Spring MVC 底层原理深度解析
一、核心架构与组件
Spring MVC 基于 前端控制器模式,核心组件是 DispatcherServlet
,它作为统一入口处理所有请求,协调各组件工作:
核心组件职责:
组件 | 职责 |
---|---|
DispatcherServlet | 前端控制器,请求处理入口 |
HandlerMapping | 映射请求URL到处理器(Controller) |
HandlerAdapter | 执行处理器方法,处理参数绑定和返回值 |
ViewResolver | 将逻辑视图名解析为实际视图对象 |
View | 渲染模型数据,生成响应内容 |
HandlerExceptionResolver | 统一处理异常 |
二、请求处理全流程
完整处理流程(源码级):
三、核心源码剖析
1. DispatcherServlet 入口方法
public class DispatcherServlet extends FrameworkServlet {
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) {
// 1. 获取HandlerExecutionChain
HandlerExecutionChain mappedHandler = getHandler(request);
// 2. 获取HandlerAdapter
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 3. 执行拦截器preHandle
if (!mappedHandler.applyPreHandle(request, response)) return;
// 4. 实际调用处理器
ModelAndView mv = ha.handle(request, response, mappedHandler.getHandler());
// 5. 应用默认视图名
applyDefaultViewName(request, mv);
// 6. 执行拦截器postHandle
mappedHandler.applyPostHandle(request, response, mv);
// 7. 处理渲染结果
processDispatchResult(request, response, mappedHandler, mv, null);
}
private void processDispatchResult(...) {
// 处理视图渲染
render(mv, request, response);
// 触发拦截器afterCompletion
mappedHandler.triggerAfterCompletion(request, response, null);
}
}
2. HandlerAdapter 执行处理器
public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter {
protected ModelAndView handleInternal(...) {
// 1. 准备模型和会话
ModelAndView mav = prepareModelAndView(mavContainer, modelFactory, webRequest);
// 2. 实际调用处理器方法
invokeHandlerMethod(request, response, handlerMethod);
// 3. 返回ModelAndView
return getModelAndView(mavContainer, modelFactory, webRequest);
}
protected void invokeHandlerMethod(...) {
// 创建ServletInvocableHandlerMethod
ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
// 设置参数解析器
invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
// 设置返回值处理器
invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
// 执行方法
invocableMethod.invokeAndHandle(webRequest, mavContainer);
}
}
四、关键机制深度解析
1. 参数绑定机制(HandlerMethodArgumentResolver)
Spring MVC 使用 策略模式 处理参数绑定:
public interface HandlerMethodArgumentResolver {
boolean supportsParameter(MethodParameter parameter);
Object resolveArgument(...) throws Exception;
}
常见参数解析器:
RequestParamMethodArgumentResolver
:处理@RequestParam
PathVariableMethodArgumentResolver
:处理@PathVariable
RequestResponseBodyMethodProcessor
:处理@RequestBody
ModelAttributeMethodProcessor
:处理@ModelAttribute
2. 返回值处理(HandlerMethodReturnValueHandler)
public interface HandlerMethodReturnValueHandler {
boolean supportsReturnType(MethodParameter returnType);
void handleReturnValue(...) throws Exception;
}
常见返回值处理器:
ModelAndViewMethodReturnValueHandler
:处理 ModelAndViewViewNameMethodReturnValueHandler
:处理字符串视图名RequestResponseBodyMethodProcessor
:处理@ResponseBody
3. 视图解析流程
五、高级特性实现原理
1. 异步请求处理(Servlet 3.0+)
@GetMapping("/async")
public Callable<String> asyncProcessing() {
return () -> {
Thread.sleep(2000);
return "Async Result";
};
}
执行流程:
- 控制器返回
Callable
RequestMappingHandlerAdapter
提交任务到TaskExecutor
- 释放请求线程
- 异步任务完成后重新派发请求
2. 拦截器机制(HandlerInterceptor)
public interface HandlerInterceptor {
default boolean preHandle(...) { return true; }
default void postHandle(...) {}
default void afterCompletion(...) {}
}
执行顺序:
preHandle1 → preHandle2 → controller → postHandle2 → postHandle1 → afterCompletion2 → afterCompletion1
3. 全局异常处理
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception ex) {
return ResponseEntity.status(500).body(ex.getMessage());
}
}
实现原理:
ExceptionHandlerExceptionResolver
扫描@ControllerAdvice
- 异常发生时匹配最佳
@ExceptionHandler
方法
六、扩展点与自定义实现
1. 自定义参数解析器
public class CustomArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(CustomAnnotation.class);
}
@Override
public Object resolveArgument(...) {
// 自定义解析逻辑
return customValue;
}
}
// 注册配置
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new CustomArgumentResolver());
}
}
2. 自定义视图解析器
public class CustomViewResolver implements ViewResolver {
@Override
public View resolveViewName(String viewName, Locale locale) {
if (viewName.startsWith("custom:")) {
return new CustomView(viewName.substring(7));
}
return null;
}
}
七、性能优化策略
-
减少控制器方法执行时间
- 避免在控制器中进行复杂业务逻辑
- 使用异步处理长时间操作
-
合理使用缓存
@GetMapping("/data") @ResponseCache(duration = 60) // 自定义缓存注解 public Data getData() { ... }
-
优化视图渲染
- 启用模板引擎缓存
- 减少JSP中的Java代码
-
静态资源处理
<mvc:resources mapping="/static/**" location="/static/" cache-period="31536000"/>
八、常见问题排查指南
问题现象 | 排查方向 | 解决方案 |
---|---|---|
404 处理器找不到 | HandlerMapping配置 | 检查@RequestMapping路径 |
参数绑定失败 | HandlerMethodArgumentResolver | 验证参数注解和类型 |
视图解析失败 | ViewResolver配置 | 检查视图前缀/后缀 |
拦截器不生效 | 拦截器注册顺序 | 检查interceptor注册顺序 |
异步请求超时 | 异步超时配置 | 配置async-timeout |
JSON序列化异常 | HttpMessageConverter | 检查Jackson配置 |
九、Spring MVC 设计精髓
-
模块化设计
- 组件职责单一(SRP原则)
- 通过接口实现松耦合
-
扩展性设计
- 开放扩展点(Resolver/Handler)
- 支持自定义实现
-
约定优于配置
- 默认配置满足大部分场景
- 特殊需求可覆盖默认行为
-
面向接口编程
- 核心组件均为接口
- 便于替换实现
十、与现代框架对比
特性 | Spring MVC | Spring WebFlux |
---|---|---|
编程模型 | 命令式(阻塞IO) | 响应式(非阻塞IO) |
并发模型 | 每个请求一个线程 | 事件循环(少量线程) |
适用场景 | 传统关系型数据库应用 | 高并发、低延迟应用 |
学习曲线 | 平缓 | 陡峭(需掌握响应式编程) |
生态支持 | 极其丰富 | 快速增长 |
Spring MVC 的底层实现展示了经典框架设计的典范:
- 通过 DispatcherServlet 统一调度
- 基于 策略模式 实现组件可插拔
- 利用 拦截器链 实现横切关注点
- 通过 适配器模式 兼容多种处理器
- 使用 模板方法模式 定义处理流程
深入理解其原理需要关注:
org.springframework.web.servlet
核心包DispatcherServlet
的 doDispatch 流程- 参数解析器和返回值处理器的扩展机制
- 视图解析链的实现方式
- 异常处理的统一入口
这种设计使得 Spring MVC 在保持灵活性和扩展性的同时,提供了稳定高效的 Web 请求处理能力。