Spring原理与源码分析 Spring MVC请求处理链路

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 打断点)

步骤类名 + 方法关键代码行作用
——
1DispatcherServlet.doService()第 864 行入口:Tomcat 把请求交给 Spring
2DispatcherServlet.doDispatch()第 908 行总指挥方法!!!
3doDispatch → getHandler()第 952 行
4RequestMappingHandlerMapping.getHandler()第 142 行匹配 @RequestMapping 路径
5AbstractHandlerMapping.getHandlerExecutionChain()第 198 行组装拦截器链(HandlerInterceptor)
6doDispatch → getHandlerAdapter()第 980 行找能处理 HandlerMethod 的 Adapter
7RequestMappingHandlerAdapter.supports()返回 true支持 HandlerMethod 类型
8doDispatch → handlerAdapter.handle()第 1012 行真正执行处理器
9RequestMappingHandlerAdapter.handleInternal()第 142 行准备调用
10RequestMappingHandlerAdapter.invokeHandlerMethod()第 168 行核心!!!
11ServletInvocableHandlerMethod.invokeAndHandle()第 98 行反射调用前准备
12InvocableHandlerMethod.doInvoke()第 212 行真正反射调用 @RequestMapping 方法
13doInvoke → getMethodArgumentValues()第 234 行解析所有参数(@RequestParam、@PathVariable、@RequestBody 等)
14HandlerMethodArgumentResolver 链30+ 种解析参数(重点看 RequestResponseBodyMethodProcessor)
15方法执行完成 → getReturnValueHandlers()找返回值处理器
16RequestResponseBodyMethodProcessor.supportsReturnType()返回 true支持 @ResponseBody
17RequestResponseBodyMethodProcessor.handleReturnValue()第 178 行调用 MessageConverter
18MappingJackson2HttpMessageConverter.write()真正序列化成 JSON
19AbstractMessageConverterMethodProcessor.writeWithMessageConverters()写出响应
20HttpServletResponse.getOutputStream()最终写到 TCP
21DispatcherServlet.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+ 种,面试必问)

注解解析器
@RequestParamRequestParamMethodArgumentResolver
@PathVariablePathVariableMethodArgumentResolver
@RequestBodyRequestResponseBodyMethodProcessor
@ModelAttributeModelAttributeMethodProcessor
@RequestHeaderRequestHeaderMethodArgumentResolver
HttpEntityHttpEntityMethodProcessor
ModelModelMethodProcessor

返回值处理器链(面试必问)

返回类型处理器
@ResponseBody + ObjectRequestResponseBodyMethodProcessor
ModelAndViewModelAndViewMethodReturnValueHandler
String(视图名)ViewNameMethodReturnValueHandler
void直接结束
ResponseEntityHttpEntityMethodProcessor

终极总结:一句话说清 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 方法?”

要不要?说“要”我秒发!

文章已创建 3070

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部