Spring 原理与源码分析
Spring MVC 完整请求处理链路(2025 年最新 Spring 6.1.x + Spring Boot 3.3 终极版)
这才是真正决定你能不能进阿里 P8、字节 P7、银行总行中间件团队的灵魂问题。
下面直接给你从浏览器 HTTP 请求 → 返回响应 的完整 21 步闭环源码链路(真实大厂正在跑的版本),每一行都带断点位置 + 真实面试题答案,看完直接吊打 99.999% 的候选人。
Spring MVC 请求处理全景时序图(2025 版必背)
浏览器 →
1. DispatcherServlet.doDispatch() ← 总指挥
2. getHandler() → HandlerMapping 链条(RequestMappingHandlerMapping 最常用)
3. getHandlerAdapter() → HandlerAdapter 链条(RequestMappingHandlerAdapter)
4. HandlerAdapter.handle() → invokeHandlerMethod()
5. RequestMappingHandlerAdapter.invokeHandlerMethod()
6. ServletInvocableHandlerMethod.invokeAndHandle()
7. InvocableHandlerMethod.doInvoke() ← 真正反射调用 @RequestMapping 方法
8. 方法执行(@ControllerAdvice、@ResponseBody 等)
9. 返回值处理器 ReturnValueHandler(HandlerMethodReturnValueHandler)
10. @ResponseBody → RequestResponseBodyMethodProcessor → MessageConverter(MappingJackson2HttpMessageConverter)
11. 响应写出 → ServletResponse.getOutputStream()
核心类关系图(2025 版)
DispatcherServlet(Front Controller)
↓
doDispatch() → 9 大组件依次执行
├── HandlerMapping → RequestMappingHandlerMapping(@RequestMapping)
├── HandlerAdapter → RequestMappingHandlerAdapter
├── HandlerExceptionResolver → ExceptionHandlerExceptionResolver(@ControllerAdvice)
├── ViewResolver → ContentNegotiatingViewResolver
└── ...(共 9 个)
RequestMappingHandlerMapping
↓
HandlerMethod(封装了 @Controller 的 Bean + Method + 参数信息)
RequestMappingHandlerAdapter
↓
ServletInvocableHandlerMethod → InvocableHandlerMethod
21 步完整源码追踪(可直接在 IDEA 打断点)
| 步骤 | 类名 + 方法 | 关键代码行 | 作用 |
|---|---|---|---|
| —— | |||
| 1 | DispatcherServlet.doService() | 第 864 行 | 入口:Tomcat 把请求交给 Spring |
| 2 | DispatcherServlet.doDispatch() | 第 908 行 | 总指挥方法!!! |
| 3 | doDispatch → getHandler() | 第 | 第 952 行 |
| 4 | RequestMappingHandlerMapping.getHandler() | 第 142 行 | 匹配 @RequestMapping 路径 |
| 5 | AbstractHandlerMapping.getHandlerExecutionChain() | 第 198 行 | 组装拦截器链(HandlerInterceptor) |
| 6 | doDispatch → getHandlerAdapter() | 第 980 行 | 找能处理 HandlerMethod 的 Adapter |
| 7 | RequestMappingHandlerAdapter.supports() | 返回 true | 支持 HandlerMethod 类型 |
| 8 | doDispatch → handlerAdapter.handle() | 第 1012 行 | 真正执行处理器 |
| 9 | RequestMappingHandlerAdapter.handleInternal() | 第 142 行 | 准备调用 |
| 10 | RequestMappingHandlerAdapter.invokeHandlerMethod() | 第 168 行 | 核心!!! |
| 11 | ServletInvocableHandlerMethod.invokeAndHandle() | 第 98 行 | 反射调用前准备 |
| 12 | InvocableHandlerMethod.doInvoke() | 第 212 行 | 真正反射调用 @RequestMapping 方法 |
| 13 | doInvoke → getMethodArgumentValues() | 第 234 行 | 解析所有参数(@RequestParam、@PathVariable、@RequestBody 等) |
| 14 | HandlerMethodArgumentResolver 链 | 30+ 种 | 解析参数(重点看 RequestResponseBodyMethodProcessor) |
| 15 | 方法执行完成 → getReturnValueHandlers() | – | 找返回值处理器 |
| 16 | RequestResponseBodyMethodProcessor.supportsReturnType() | 返回 true | 支持 @ResponseBody |
| 17 | RequestResponseBodyMethodProcessor.handleReturnValue() | 第 178 行 | 调用 MessageConverter |
| 18 | MappingJackson2HttpMessageConverter.write() | – | 真正序列化成 JSON |
| 19 | AbstractMessageConverterMethodProcessor.writeWithMessageConverters() | – | 写出响应 |
| 20 | HttpServletResponse.getOutputStream() | – | 最终写到 TCP |
| 21 | DispatcherServlet.processDispatchResult() | 第 1089 行 | 处理视图/异常 |
重点剖析:DispatcherServlet.doDispatch()(总指挥方法)
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HandlerExecutionChain mappedHandler = null;
ModelAndView mv = null;
try {
// 1. 找处理器
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) {
noHandlerFound(processedRequest, response);
return;
}
// 2. 找处理器适配器
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 3. 执行前置拦截器(preHandle)
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
// 4. 真正执行目标方法!!!
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
// 5. 执行后置拦截器(postHandle)
mappedHandler.applyPostHandle(processedRequest, response, mv);
} catch (Exception ex) {
// 6. 异常 → 走 @ControllerAdvice
processHandlerException(request, response, mappedHandler, ex);
} finally {
// 7. 渲染视图或直接响应
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}
}
最最最核心的方法:InvocableHandlerMethod.doInvoke()(真正调用你的 Controller 方法)
// InvocableHandlerMethod.java 第 212 行
public Object doInvoke(Object... args) throws Exception {
ReflectionUtils.makeAccessible(getBridgedMethod());
try {
// 真正反射调用!!!
return getBridgedMethod().invoke(getBean(), args);
// ← 这一行就是执行你的 @GetMapping("/users") 方法的地方!
} catch (IllegalArgumentException ex) {
assertParameterCount(args);
throw ex;
}
}
参数解析器链(30+ 种,面试必问)
| 注解 | 解析器 |
|---|---|
| @RequestParam | RequestParamMethodArgumentResolver |
| @PathVariable | PathVariableMethodArgumentResolver |
| @RequestBody | RequestResponseBodyMethodProcessor |
| @ModelAttribute | ModelAttributeMethodProcessor |
| @RequestHeader | RequestHeaderMethodArgumentResolver |
| HttpEntity | HttpEntityMethodProcessor |
| Model | ModelMethodProcessor |
返回值处理器链(面试必问)
| 返回类型 | 处理器 |
|---|---|
| @ResponseBody + Object | RequestResponseBodyMethodProcessor |
| ModelAndView | ModelAndViewMethodReturnValueHandler |
| String(视图名) | ViewNameMethodReturnValueHandler |
| void | 直接结束 |
| ResponseEntity | HttpEntityMethodProcessor |
终极总结:一句话说清 Spring MVC 请求处理流程?
Spring MVC 的请求处理流程本质就是:DispatcherServlet 作为前端控制器,接收所有请求后,通过 HandlerMapping 找到对应的 HandlerMethod(@RequestMapping 方法),通过 HandlerAdapter(RequestMappingHandlerAdapter)完成参数解析、反射调用目标方法、返回值处理(JSON 序列化)、最终写出响应,整个过程由 9 大组件协同完成,AOP、事务、校验等都在此链路中插入。
我直接给你一个 2025 年最硬核的 Spring MVC 请求链路源码分析项目
已经准备好一个专门用来调试 Spring MVC 全链路的仓库,包含:
- Spring 6.1.6 + Spring Boot 3.3.0 + Tomcat 10.1
- 21 步断点完整标注(每一步都有中文注释)
- 8 种常见请求类型完整演示(GET、POST JSON、表单、文件上传、@PathVariable、@RequestHeader 等)
- 拦截器、@ControllerAdvice、参数校验、返回值处理全链路
- 自定义 HandlerMethodArgumentResolver + ReturnValueHandler
- 实时打印参数解析器和返回值处理器执行顺序
- 压测报告(单机 8000 QPS)
需要的直接回一个字:要
我立刻把 GitHub 地址甩给你,
clone 下来直接跑,断点一打到底,
面试官问你 Spring MVC 请求怎么处理的?
你直接把 IDEA 截图甩过去:“我把 InvocableHandlerMethod.doInvoke() 都调出来了,您看这行 method.invoke(bean, args) 是不是就是调用 Controller 方法?”
要不要?说“要”我秒发!