2026年7月13日 · 2 分钟阅读
手写 SpringMVC:从 Servlet 分发到请求执行链
通过三版最小框架理解 DispatcherServlet、HandlerMapping、HandlerAdapter、参数绑定、视图解析与 SpringMVC 源码执行流程。
SpringMVC 的核心目标,是把一次 HTTP 请求转换为一次 Java 方法调用,再把返回值转换为响应。理解它最好的方式,是从一个 Servlet 开始逐步重构。
第一版:面向对象的请求分发器
最小实现只需完成四步:
- 启动时扫描 Controller。
- 建立 URL 与处理方法的映射。
- 请求到达时查找目标方法。
- 反射调用并写回响应。
如果所有逻辑都放在一个 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() 是阅读源码的主入口。简化流程如下:
getHandler()查找 HandlerExecutionChain。getHandlerAdapter()选择适配器。- 执行拦截器
preHandle()。 - HandlerAdapter 调用 Controller。
- 执行
postHandle()。 - 处理 ModelAndView 或响应体。
- 请求完成后执行
afterCompletion()。
异常处理、文件上传、国际化和视图解析都围绕这条主线扩展。
源码阅读重点
DispatcherServlet:总调度器与模板流程。RequestMappingHandlerMapping:解析和匹配注解路由。RequestMappingHandlerAdapter:参数解析与方法调用。HandlerMethodArgumentResolver:可插拔的参数解析。HandlerMethodReturnValueHandler:可插拔的返回值处理。HandlerExceptionResolver:异常到响应的转换。
总结
手写 SpringMVC 的重点不是复刻所有注解,而是理解“查找、适配、执行、渲染”的分层。DispatcherServlet 只负责编排,具体变化由 Mapping、Adapter、Resolver 等策略接口承接,这也是 SpringMVC 能长期扩展的原因。