2026年7月13日 · 2 分钟阅读

手写 SpringMVC:从 Servlet 分发到请求执行链

通过三版最小框架理解 DispatcherServlet、HandlerMapping、HandlerAdapter、参数绑定、视图解析与 SpringMVC 源码执行流程。

SpringMVC 的核心目标,是把一次 HTTP 请求转换为一次 Java 方法调用,再把返回值转换为响应。理解它最好的方式,是从一个 Servlet 开始逐步重构。

第一版:面向对象的请求分发器

最小实现只需完成四步:

  1. 启动时扫描 Controller。
  2. 建立 URL 与处理方法的映射。
  3. 请求到达时查找目标方法。
  4. 反射调用并写回响应。

如果所有逻辑都放在一个 Servlet 中,很快就会出现职责混乱:路由匹配、参数转换、方法调用和结果渲染互相耦合。

第二版:与 Spring IoC 整合

Controller 不应由 MVC 框架重复创建,而应从 Spring 容器获取。整合后的结构是:Spring 管对象生命周期,SpringMVC 管请求执行。

HttpServletRequest
  -> DispatcherServlet
  -> HandlerMapping
  -> HandlerAdapter
  -> Controller Method
  -> ViewResolver / ResponseBody

第三版:注解式 Handler

加入 @Controller@RequestMapping 和参数注解后,启动阶段会把类和方法元数据解析成 Handler。请求阶段不再扫描类,而是直接匹配已经建立的映射。

HandlerAdapter 解决“如何执行 Handler”的问题:

  • 识别方法参数。
  • 从路径、查询参数或请求体取值。
  • 完成类型转换。
  • 反射调用目标方法。
  • 处理返回值。

这层抽象让 DispatcherServlet 不需要知道 Handler 的具体形态。

SpringMVC 的正式执行流程

DispatcherServlet#doDispatch() 是阅读源码的主入口。简化流程如下:

  1. getHandler() 查找 HandlerExecutionChain。
  2. getHandlerAdapter() 选择适配器。
  3. 执行拦截器 preHandle()
  4. HandlerAdapter 调用 Controller。
  5. 执行 postHandle()
  6. 处理 ModelAndView 或响应体。
  7. 请求完成后执行 afterCompletion()

异常处理、文件上传、国际化和视图解析都围绕这条主线扩展。

源码阅读重点

  • DispatcherServlet:总调度器与模板流程。
  • RequestMappingHandlerMapping:解析和匹配注解路由。
  • RequestMappingHandlerAdapter:参数解析与方法调用。
  • HandlerMethodArgumentResolver:可插拔的参数解析。
  • HandlerMethodReturnValueHandler:可插拔的返回值处理。
  • HandlerExceptionResolver:异常到响应的转换。

总结

手写 SpringMVC 的重点不是复刻所有注解,而是理解“查找、适配、执行、渲染”的分层。DispatcherServlet 只负责编排,具体变化由 Mapping、Adapter、Resolver 等策略接口承接,这也是 SpringMVC 能长期扩展的原因。