Spring MVC原理与源码:从请求到响应的全流程解析

Spring MVC 请求处理全流程

DispatcherServlet 初始化

Spring MVC 的核心入口是 DispatcherServlet,它在 Web 容器启动时初始化。通过 initStrategies() 方法加载以下组件:

  • HandlerMapping:映射请求到处理器(Controller 或方法)
  • HandlerAdapter:执行处理器并返回 ModelAndView
  • ViewResolver:解析视图名称到具体视图实现

请求处理阶段

  1. 请求接收与分发
    DispatcherServletdoDispatch() 方法处理请求:

    • 通过 HandlerMapping 找到匹配的 HandlerExecutionChain(包含拦截器链)
    • 调用拦截器的 preHandle() 方法
  2. 处理器执行
    HandlerAdapter 执行处理器方法:

    • 参数解析:通过 HandlerMethodArgumentResolver 处理 @RequestParam@RequestBody 等注解
    • 返回值处理:通过 HandlerMethodReturnValueHandler 处理 @ResponseBody、视图名称等
  3. 视图渲染

    • 若返回 ModelAndView,调用 ViewResolver 解析视图
    • 视图的 render() 方法生成响应内容(如 JSP、Thymeleaf 模板)
  4. 拦截器后处理

    调用拦截器的 postHandle()afterCompletion() 方法

关键源码解析

HandlerMapping 实现
RequestMappingHandlerMapping 扫描 @Controller@RequestMapping 注解,构建 RequestMappingInfoHandlerMethod 的映射表。匹配时通过 PathPatternAntPathMatcher 比较 URL。

参数绑定流程
RequestParamMethodArgumentResolver 处理简单类型参数:

java 复制代码
public Object resolveArgument(...) {
    String paramValue = webRequest.getParameter(paramName);
    return typeConverter.convertIfNecessary(paramValue, paramType);
}

JSON 处理示例
AbstractMessageConverterMethodProcessor 处理 @RequestBody

java 复制代码
protected <T> Object readWithMessageConverters(...) {
    for (HttpMessageConverter<?> converter : messageConverters) {
        if (converter.canRead(targetType, contentType)) {
            return converter.read(targetType, request);
        }
    }
}

扩展点与优化

自定义组件

  • 实现 WebMvcConfigurer 配置拦截器、参数解析器等
  • 继承 AbstractHandlerMethodAdapter 实现自定义处理器适配器

性能优化方向

  • 使用 @ControllerAdvice 统一异常处理
  • 配置静态资源缓存减少视图解析开销
  • 异步处理(DeferredResult/SseEmitter)提升并发能力

调试技巧

日志配置

logback.xml 中启用调试日志:

XML 复制代码
<logger name="org.springframework.web" level="DEBUG"/>

gitee.com/zjbing/tglhhkyh/blob/master/README.md

gitee.com/yinshuiyu/aofkovvy/blob/master/README.md

gitee.com/zjwno1/iuyveaam/blob/master/README.md

gitee.com/zjbing/xmggbbes/blob/master/README.md

gitee.com/yinshuiyu/bkifzcwd/blob/master/README.md

gitee.com/zjwno1/oiatahwi/blob/master/README.md

gitee.com/zjbing/ystnzvuw/blob/master/README.md

gitee.com/yinshuiyu/jvtjfymz/blob/master/README.md

gitee.com/zjwno1/hdlrwjvu/blob/master/README.md

gitee.com/zjbing/ygkkhwvt/blob/master/README.md

gitee.com/zjwno1/vjuloxuq/blob/master/README.md

gitee.com/yinshuiyu/comcanea/blob/master/README.md

gitee.com/zjbing/udqlelak/blob/master/README.md

gitee.com/zjbing/mnlklhwf/blob/master/README.md

gitee.com/yinshuiyu/qwqjijce/blob/master/README.md

gitee.com/zjwno1/gxspyhor/blob/master/README.md

gitee.com/zjbing/gxvovntu/blob/master/README.md

gitee.com/zjwno1/ewkdyivm/blob/master/README.md

gitee.com/yinshuiyu/kaybbrkj/blob/master/README.md

gitee.com/zjbing/tmkruuac/blob/master/README.md

gitee.com/zjwno1/aqjmyuoc/blob/master/README.md

gitee.com/yinshuiyu/qagdnatb/blob/master/README.md

gitee.com/zjbing/cfnkdnqq/blob/master/README.md

gitee.com/zjwno1/xypmphdz/blob/master/README.md

gitee.com/yinshuiyu/yftjnwds/blob/master/README.md

gitee.com/zjbing/zqcppati/blob/master/README.md

gitee.com/zjbing/uxlnhtjl/blob/master/README.md

gitee.com/zjwno1/rcqhxtsr/blob/master/README.md

gitee.com/yinshuiyu/otrcipyl/blob/master/README.md

gitee.com/zjbing/yyczwkdt/blob/master/README.md

gitee.com/zjwno1/lnkmijco/blob/master/README.md

gitee.com/yinshuiyu/jevpwfon/blob/master/README.md

gitee.com/zjbing/twrobrjt/blob/master/README.md

gitee.com/zjwno1/inylsbex/blob/master/README.md

gitee.com/yinshuiyu/zkhklsfi/blob/master/README.md

gitee.com/zjbing/bdxeczbk/blob/master/README.md

gitee.com/zjwno1/bvtahbbg/blob/master/README.md

gitee.com/yinshuiyu/mupfoihd/blob/master/README.md

gitee.com/zjbing/tterbkzu/blob/master/README.md

gitee.com/zjwno1/tbheeeba/blob/master/README.md

gitee.com/yinshuiyu/drxuzira/blob/master/README.md

gitee.com/zjbing/hnofmpya/blob/master/README.md

gitee.com/zjwno1/whudqotk/blob/master/README.md

gitee.com/zjbing/msjfbpce/blob/master/README.md

gitee.com/yinshuiyu/jzghuwiu/blob/master/README.md

gitee.com/zjbing/iqboslho/blob/master/README.md

gitee.com/zjwno1/aamscsbz/blob/master/README.md

gitee.com/yinshuiyu/xeyzsbgc/blob/master/README.md

gitee.com/zjbing/ypzapxap/blob/master/README.md

gitee.com/yinshuiyu/htawdqtj/blob/master/README.md

gitee.com/zjwno1/mztudxzj/blob/master/README.md

gitee.com/zjbing/wyagddcl/blob/master/README.md

gitee.com/yinshuiyu/njwxtagc/blob/master/README.md

gitee.com/zjwno1/npuqehop/blob/master/README.md

gitee.com/zjbing/jnokgqmi/blob/master/README.md

gitee.com/yinshuiyu/qxxzplug/blob/master/README.md

gitee.com/zjbing/boptaxtm/blob/master/README.md

gitee.com/zjwno1/ruirzgoe/blob/master/README.md

gitee.com/yinshuiyu/sezifwyi/blob/master/README.md

gitee.com/zjbing/yqdxlrex/blob/master/README.md

gitee.com/zjwno1/ofpylhxq/blob/master/README.md

gitee.com/zjbing/yjwktwsv/blob/master/README.md

gitee.com/yinshuiyu/amwvwqdt/blob/master/README.md

gitee.com/zjwno1/nquvvcyh/blob/master/README.md

gitee.com/zjbing/fppssbit/blob/master/README.md

gitee.com/yinshuiyu/hsyiwygc/blob/master/README.md

gitee.com/zjwno1/psdqajxg/blob/master/README.md

gitee.com/zjbing/ffhociwp/blob/master/README.md

gitee.com/yinshuiyu/rswfvrhk/blob/master/README.md

gitee.com/zjwno1/jpwzmvwl/blob/master/README.md

gitee.com/zjbing/dbnwfqdw/blob/master/README.md

gitee.com/yinshuiyu/ipggjgoy/blob/master/README.md

gitee.com/zjwno1/ftlljddm/blob/master/README.md

gitee.com/zjbing/uzjdngdx/blob/master/README.md

gitee.com/yinshuiyu/twtdttci/blob/master/README.md

gitee.com/zjbing/ofkderbt/blob/master/README.md

gitee.com/zjwno1/fobylykt/blob/master/README.md

gitee.com/yinshuiyu/galthqtt/blob/master/README.md

gitee.com/zjbing/ehlqqgpu/blob/master/README.md

gitee.com/zjwno1/mscgweoh/blob/master/README.md

gitee.com/yinshuiyu/lbbzbujv/blob/master/README.md

gitee.com/zjbing/jzbstpyh/blob/master/README.md

gitee.com/zjwno1/ejhifrhq/blob/master/README.md

gitee.com/zjbing/jccrcitf/blob/master/README.md

gitee.com/yinshuiyu/wlnaugvb/blob/master/README.md

gitee.com/zjwno1/uwhofgis/blob/master/README.md

gitee.com/zjbing/mztfcihg/blob/master/README.md

gitee.com/yinshuiyu/ckxauqpw/blob/master/README.md

gitee.com/zjwno1/zntitslu/blob/master/README.md

gitee.com/zjbing/uxptlvmb/blob/master/README.md

gitee.com/yinshuiyu/sgoqrkxb/blob/master/README.md

gitee.com/zjbing/apfliums/blob/master/README.md

gitee.com/zjwno1/dummpvxp/blob/master/README.md

gitee.com/yinshuiyu/tyelusrh/blob/master/README.md

gitee.com/zjbing/ugtwqjpp/blob/master/README.md

gitee.com/zjwno1/ljkoelew/blob/master/README.md

gitee.com/zjbing/inwwwjil/blob/master/README.md

gitee.com/yinshuiyu/epnszich/blob/master/README.md

gitee.com/zjwno1/xqsmmjqi/blob/master/README.md

gitee.com/zjbing/yrlemsfj/blob/master/README.md

gitee.com/yinshuiyu/rhmfvuwc/blob/master/README.md

gitee.com/zjwno1/ftcibsra/blob/master/README.md

gitee.com/zjbing/oqyycylo/blob/master/README.md

gitee.com/yinshuiyu/sdbnjxqy/blob/master/README.md

gitee.com/zjbing/hgggjsmy/blob/master/README.md

gitee.com/zjwno1/wxgeykzt/blob/master/README.md

gitee.com/yinshuiyu/jmnqtcpo/blob/master/README.md

gitee.com/zjbing/hjzaaxcl/blob/master/README.md

gitee.com/zjwno1/bbygvpis/blob/master/README.md

gitee.com/yinshuiyu/grdqzmsf/blob/master/README.md

gitee.com/zjbing/bkawfcpo/blob/master/README.md

gitee.com/zjwno1/nlwwddgq/blob/master/README.md

gitee.com/yinshuiyu/xydgtagj/blob/master/README.md

gitee.com/zjbing/vduuqznm/blob/master/README.md

gitee.com/zjwno1/mbbxyzyi/blob/master/README.md

gitee.com/yinshuiyu/okcwukdv/blob/master/README.md

gitee.com/zjbing/xnufzttc/blob/master/README.md

gitee.com/zjbing/qzxeocyv/blob/master/README.md

gitee.com/zjwno1/ziqqgnws/blob/master/README.md

gitee.com/yinshuiyu/grfmzmil/blob/master/README.md

gitee.com/zjbing/bmifwtpf/blob/master/README.md

gitee.com/yinshuiyu/bwadbkkq/blob/master/README.md

gitee.com/zjwno1/nqmpwwlh/blob/master/README.md

gitee.com/zjbing/brsmxnky/blob/master/README.md

gitee.com/yinshuiyu/lwallcuq/blob/master/README.md

gitee.com/zjwno1/sevifsap/blob/master/README.md

gitee.com/zjbing/aaztazfe/blob/master/README.md

gitee.com/zjbing/cbwdhent/blob/master/README.md

gitee.com/yinshuiyu/qtbwphuy/blob/master/README.md

gitee.com/zjwno1/narsobes/blob/master/README.md

gitee.com/zjbing/bqxipwkn/blob/master/README.md

gitee.com/yinshuiyu/irgthdmj/blob/master/README.md

gitee.com/zjwno1/crcjqmtt/blob/master/README.md

gitee.com/zjbing/daahbuet/blob/master/README.md

gitee.com/yinshuiyu/zvzkmlrt/blob/master/README.md

gitee.com/zjwno1/ismirybn/blob/master/README.md

gitee.com/zjbing/zxkkebnx/blob/master/README.md

gitee.com/zjwno1/fmbctuho/blob/master/README.md

gitee.com/zjbing/dtsovwsy/blob/master/README.md

gitee.com/yinshuiyu/ivqhuwfl/blob/master/README.md

gitee.com/zjbing/llwhkktf/blob/master/README.md

gitee.com/zjwno1/ixexvjvv/blob/master/README.md

gitee.com/yinshuiyu/ynyefjoq/blob/master/README.md

gitee.com/zjbing/xhjauwsx/blob/master/README.md

gitee.com/zjwno1/geneykgg/blob/master/README.md

gitee.com/yinshuiyu/nyxiryup/blob/master/README.md

gitee.com/zjbing/bdaxeabj/blob/master/README.md

gitee.com/zjwno1/isjsdaws/blob/master/README.md

gitee.com/yinshuiyu/lstwqclh/blob/master/README.md

gitee.com/zjbing/fevohbxg/blob/master/README.md

gitee.com/yinshuiyu/jugtjldv/blob/master/README.md

gitee.com/zjbing/vandtjlo/blob/master/README.md

gitee.com/zjwno1/cpaaryxa/blob/master/README.md

gitee.com/yinshuiyu/lczaivhz/blob/master/README.md

gitee.com/zjbing/qdkyacpo/blob/master/README.md

gitee.com/zjwno1/tyxqvyug/blob/master/README.md

gitee.com/yinshuiyu/ohdkrrub/blob/master/README.md

gitee.com/zjbing/ikhhhela/blob/master/README.md

断点设置

关键断点位置:

  • DispatcherServlet.doDispatch()
  • RequestMappingHandlerAdapter.invokeHandlerMethod()
  • View.render()
相关推荐
懒鸟一枚3 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
我命由我123454 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑4 小时前
Sentinel安装
java·后端·微服务
凤凰院凶涛QAQ6 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
掘金_答案7 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
猿与禅7 小时前
CosId 分布式 ID 生成器完全教程:从架构原理到生产落地
java·shardingsphere·雪花算法·分布式id·高性能·cosid·号段模式
MindUp7 小时前
企业网盘权限模型解析:多层级访问控制与审计能力选型指南
java·linux·运维
NG4777 小时前
【软件设计与体系结构】-策略设计模式
java·设计模式·软件工程
程序员天天困8 小时前
优雅记录操作日志:从注解到 SpEL 的全链路实践与开源方案对比
java·后端
战血石LoveYY8 小时前
Integer类型超限,导致数据异常
java·算法