揭秘Spring Boot的请求处理全流程:从启动到响应的奥秘

揭秘 Spring Boot 的请求处理全流程:从启动到响应的奥秘
(2025–2026 视角,基于 Spring Boot 3.x / Spring Framework 6.x)

Spring Boot 的请求处理看似“简单”,但内部其实是一套精心设计的分层架构,核心围绕 DispatcherServlet(前端控制器)展开。

我们把整个生命周期拆成两大阶段:

  1. 启动阶段(Application Startup → 容器就绪)
  2. 请求处理阶段(HTTP Request → Response)

一、启动阶段:Spring Boot 如何准备好接收请求?

步骤关键动作核心类/机制说明
1执行 main() → SpringApplication.run()SpringApplication创建 SpringApplication 实例,推断应用类型(Servlet / Reactive)
2创建并刷新 ApplicationContextAnnotationConfigServletWebServerApplicationContext扫描 @SpringBootApplication → @ComponentScan、@EnableAutoConfiguration
3自动配置 Web 环境WebMvcAutoConfiguration / ServletWebServerFactoryAutoConfiguration条件装配 DispatcherServlet、Tomcat/Jetty/Undertow 等嵌入式服务器
4注册 DispatcherServletDispatcherServletRegistrationBean作为 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() 内部顺序)

  1. 接收请求
  • Tomcat → Connector → CoyoteAdapter → StandardWrapperValve → DispatcherServlet.service()
  1. 准备请求环境
  • 包装 request/response 为 ServletRequestAttributes
  • 发布 ServletRequestHandledEvent(可选监控)
  1. 查找 Handler(处理器)
  • DispatcherServlet.getHandler()
  • 遍历所有 HandlerMapping(优先级顺序)
    最重要实现:RequestMappingHandlerMapping(@RequestMapping / @GetMapping 等)
  • 返回 HandlerExecutionChain(包含 Controller 方法 + 拦截器列表)
  1. 查找 HandlerAdapter
  • DispatcherServlet.getHandlerAdapter(handler)
  • 常见实现:RequestMappingHandlerAdapter(支持 @Controller)
  • 其他:HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter 等
  1. 执行拦截器 preHandle
  • 依次调用 HandlerInterceptor.preHandle()
  • 任意一个返回 false → 流程中断,直接跳到 afterCompletion
  1. 适配器调用目标方法
  • HandlerAdapter.handle(request, response, handler)
  • RequestMappingHandlerAdapter 内部:
    → HandlerMethodArgumentResolver 解析参数(@RequestParam、@PathVariable、@RequestBody、Model 等)
    → 反射调用 Controller 方法
    → 得到返回值(String、ModelAndView、ResponseEntity、@ResponseBody 对象等)
  1. 处理返回值
  • HandlerMethodReturnValueHandler 处理返回值 常见:
    • ViewNameMethodReturnValueHandler(返回视图名)
    • RequestResponseBodyMethodProcessor(@ResponseBody → JSON)
    • HttpEntityMethodProcessor
    • ResponseStatusException 等异常处理
  1. 执行拦截器 postHandle
  • 逆序调用 postHandle(ModelAndView 已准备好,可修改)
  1. 视图渲染 / 响应输出
  • 如果是视图:ViewResolver → View.render()(Thymeleaf/FreeMarker/JSP 等)
  • 如果是 @ResponseBody:HttpMessageConverter 写出 JSON/XML 等
  • 写入 HttpServletResponse
  1. 执行 afterCompletion
    • 无论成功失败,都会调用(清理资源、日志等)
  2. 异常处理流程
    • 任意环节抛异常 → HandlerExceptionResolver
    • 优先级最高:@ControllerAdvice + @ExceptionHandler
    • 次之:SimpleMappingExceptionResolver 等

三、常见组件速查表(面试/调试必备)

组件作用常见实现类可自定义方式
HandlerMappingURL → 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 的流程差异

告诉我你的关注点,继续带你深挖~

文章已创建 4695

发表回复

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

相关文章

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

返回顶部