揭秘 Spring Boot 的请求处理全流程:从启动到响应的奥秘
(2025–2026 视角,基于 Spring Boot 3.x / Spring Framework 6.x)
Spring Boot 的请求处理看似“简单”,但内部其实是一套精心设计的分层架构,核心围绕 DispatcherServlet(前端控制器)展开。
我们把整个生命周期拆成两大阶段:
- 启动阶段(Application Startup → 容器就绪)
- 请求处理阶段(HTTP Request → Response)
一、启动阶段:Spring Boot 如何准备好接收请求?
| 步骤 | 关键动作 | 核心类/机制 | 说明 |
|---|---|---|---|
| 1 | 执行 main() → SpringApplication.run() | SpringApplication | 创建 SpringApplication 实例,推断应用类型(Servlet / Reactive) |
| 2 | 创建并刷新 ApplicationContext | AnnotationConfigServletWebServerApplicationContext | 扫描 @SpringBootApplication → @ComponentScan、@EnableAutoConfiguration |
| 3 | 自动配置 Web 环境 | WebMvcAutoConfiguration / ServletWebServerFactoryAutoConfiguration | 条件装配 DispatcherServlet、Tomcat/Jetty/Undertow 等嵌入式服务器 |
| 4 | 注册 DispatcherServlet | DispatcherServletRegistrationBean | 作为 Servlet 注册到 Servlet 容器,默认映射路径 /* |
| 5 | 启动嵌入式 Web 服务器 | Tomcat / Jetty / Undertow | 监听端口(默认 8080),开始接受 TCP 连接 |
| 6 | 容器启动完成 | ApplicationReadyEvent | 所有 bean 就绪,应用可对外服务 |
关键结论:
Spring Boot 启动后,DispatcherServlet 已经被注册为 Servlet,嵌入式服务器(如 Tomcat)已经监听端口,随时准备接收请求。
二、请求处理阶段:一条 HTTP 请求的完整旅程(最核心部分)
经典流程图(文字版):
客户端 → TCP 连接 → 嵌入式服务器(Tomcat) → Servlet Filter Chain
↓
DispatcherServlet.service()
↓
doDispatch() 方法(核心分发)
↓
HandlerMapping → 找到 HandlerExecutionChain
↓
HandlerInterceptor.preHandle()(拦截器前置)
↓
HandlerAdapter → 调用 Controller 方法
↓
执行 @Controller / @RestController 方法
↓
返回值 → HandlerMethodReturnValueHandler 处理
↓
HandlerInterceptor.postHandle()(后置)
↓
ViewResolver / HttpMessageConverter → 渲染响应
↓
HandlerInterceptor.afterCompletion()(完成)
↓
Response → 客户端
详细步骤拆解(按 DispatcherServlet.doDispatch() 内部顺序)
- 接收请求
- Tomcat → Connector → CoyoteAdapter → StandardWrapperValve → DispatcherServlet.service()
- 准备请求环境
- 包装 request/response 为 ServletRequestAttributes
- 发布 ServletRequestHandledEvent(可选监控)
- 查找 Handler(处理器)
- DispatcherServlet.getHandler()
- 遍历所有 HandlerMapping(优先级顺序)
最重要实现:RequestMappingHandlerMapping(@RequestMapping / @GetMapping 等) - 返回 HandlerExecutionChain(包含 Controller 方法 + 拦截器列表)
- 查找 HandlerAdapter
- DispatcherServlet.getHandlerAdapter(handler)
- 常见实现:RequestMappingHandlerAdapter(支持 @Controller)
- 其他:HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter 等
- 执行拦截器 preHandle
- 依次调用 HandlerInterceptor.preHandle()
- 任意一个返回 false → 流程中断,直接跳到 afterCompletion
- 适配器调用目标方法
- HandlerAdapter.handle(request, response, handler)
- RequestMappingHandlerAdapter 内部:
→ HandlerMethodArgumentResolver 解析参数(@RequestParam、@PathVariable、@RequestBody、Model 等)
→ 反射调用 Controller 方法
→ 得到返回值(String、ModelAndView、ResponseEntity、@ResponseBody 对象等)
- 处理返回值
- HandlerMethodReturnValueHandler 处理返回值 常见:
- ViewNameMethodReturnValueHandler(返回视图名)
- RequestResponseBodyMethodProcessor(@ResponseBody → JSON)
- HttpEntityMethodProcessor
- ResponseStatusException 等异常处理
- 执行拦截器 postHandle
- 逆序调用 postHandle(ModelAndView 已准备好,可修改)
- 视图渲染 / 响应输出
- 如果是视图:ViewResolver → View.render()(Thymeleaf/FreeMarker/JSP 等)
- 如果是 @ResponseBody:HttpMessageConverter 写出 JSON/XML 等
- 写入 HttpServletResponse
- 执行 afterCompletion
- 无论成功失败,都会调用(清理资源、日志等)
- 异常处理流程
- 任意环节抛异常 → HandlerExceptionResolver
- 优先级最高:@ControllerAdvice + @ExceptionHandler
- 次之:SimpleMappingExceptionResolver 等
三、常见组件速查表(面试/调试必备)
| 组件 | 作用 | 常见实现类 | 可自定义方式 |
|---|---|---|---|
| HandlerMapping | URL → Handler 映射 | RequestMappingHandlerMapping | 实现 HandlerMapping 接口 |
| HandlerAdapter | 调用 Handler 的适配器 | RequestMappingHandlerAdapter | 实现 HandlerAdapter |
| HandlerInterceptor | 前/后/完成拦截 | HandlerInterceptorAdapter / 自定义 | 实现 HandlerInterceptor |
| HandlerMethodArgumentResolver | 参数解析 | @RequestParam / @RequestBody 等 | 实现 ArgumentResolver |
| HandlerMethodReturnValueHandler | 返回值处理 | @ResponseBody / ModelAndView | 实现 ReturnValueHandler |
| ViewResolver | 视图名 → View 对象 | ThymeleafViewResolver / InternalResourceViewResolver | 配置 ViewResolver Bean |
| HttpMessageConverter | 对象 ↔ JSON/XML/其他 | MappingJackson2HttpMessageConverter | 配置 MessageConverters |
| HandlerExceptionResolver | 统一异常处理 | @ControllerAdvice + @ExceptionHandler | 实现 HandlerExceptionResolver |
四、现代 Spring Boot(3.x+)的几个重要变化点
- WebFlux 模式下使用 DispatcherHandler 而非 DispatcherServlet(响应式)
- 函数式端点(RouterFunction)通过 RouterFunctionMapping 处理
- GraalVM Native Image 支持下,提前初始化 DispatcherServlet 相关组件
- 更多使用 @ControllerAdvice 统一异常/响应包装
- Actuator + Micrometer 观察请求全链路指标(http.server.requests)
五、快速记忆口诀
“Tomcat 接 → Disp 分 → Map 找 → Adapter 调 → Controller 执 → Resolver 转 → Response 出”
拦截三部曲:pre → handle → post / afterCompletion
想深入哪一块?
- 源码级 doDispatch() 逐行拆解
- @ControllerAdvice 如何介入
- Filter vs Interceptor vs ArgumentResolver 区别
- 如何自定义 HandlerMapping / Adapter
- WebFlux 对比传统 MVC 的流程差异
告诉我你的关注点,继续带你深挖~