Spring Boot 启动到响应:一个 HTTP 请求是怎么走到 Controller 的?

开篇

很多人用 Spring Boot 好几年,但对"请求进来后到底发生了什么"说不清楚。

面试一问:"DispatcherServlet 是什么?请求怎么被分发的?"就卡住。

这篇不贴大段源码,就带你走一遍主链路:启动 → 初始化 → 接收请求 → 分发 → 返回响应。


一、Spring Boot 启动时做了什么

Spring Boot 的入口大家都熟悉:

java

typescript 复制代码
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

SpringApplication.run 里最核心的一件事,是创建并刷新 ApplicationContext。

可以简单理解为:

把工程里所有注解标记的类扫描出来,统一管理,建立依赖关系,全部放到一个容器里。


二、HTTP 请求的第一站:DispatcherServlet

请求进来后,不会直接到你的 Controller,而是先到 DispatcherServlet。

为什么是它?

因为 Spring Boot 自动配置了 DispatcherServletAutoConfiguration,它把 DispatcherServlet 注册成了所有请求的统一入口。

它就像公司前台,所有来访的人先经过它,再由它分配。


三、DispatcherServlet 怎么找到你的 Controller

它的核心流程,简化后就是:

text

bash 复制代码
请求 /user/info
    ↓
DispatcherServlet
    ↓
HandlerMapping 找到对应的 Controller 方法
    ↓
HandlerAdapter 调用这个方法
    ↓
方法返回结果
    ↓
ViewResolver 或 HttpMessageConverter 处理返回值
    ↓
响应写回客户端

翻译成人话:

  • HandlerMapping:负责根据 URL 找方法
  • HandlerAdapter:负责真正去调用
  • HttpMessageConverter:负责把返回值转成 JSON

四、为什么你写的 @GetMapping 能被找到

你写的:

java

kotlin 复制代码
@RestController
public class UserController {
    @GetMapping("/user/info")
    public String info() {
        return "ok";
    }
}

启动时,Spring 把它扫进容器。

同时,@GetMapping 的信息被注册到 RequestMappingHandlerMapping 里,保存了:

URL /user/info → 对应方法 UserController.info()

请求来时,一查表就找到。


五、整条链路总结

text

javascript 复制代码
HTTP 请求
    ↓
DispatcherServlet(统一入口)
    ↓
HandlerMapping(按 URL 找方法)
    ↓
HandlerAdapter(实际调用)
    ↓
你的 Controller 方法
    ↓
返回值处理成 JSON
    ↓
响应返回客户端

这就是一个请求的完整生命周期。


六、面试常问的延伸

问题 答案一句话
过滤器(Filter)和拦截器(Interceptor)在哪一步? Filter 在进入 DispatcherServlet 之前,Interceptor 在 HandlerMapping 之后、方法调用之前
@ResponseBody 做了什么 让返回值走 HttpMessageConverter,而不是视图解析器
多个 HandlerMapping 怎么选择 按顺序尝试,第一个能解析的就用

结尾

下一篇继续拆:一次请求为什么会经过过滤器、拦截器、AOP,三者的执行顺序到底怎么排。

想继续看就点关注,这个系列会一直更下去。

相关推荐
程序员海军7 小时前
用了两年多 GPT,我最近开始换模型了,还折腾了个求职避坑 Agent
前端·人工智能·后端
码士集团小青7 小时前
SpringBoot 集成缓存性能之王 Caffeine
spring boot·后端·缓存
excel9 小时前
IndexNow:让搜索引擎更快发现网站更新的主动通知协议
前端·后端·架构
Json____9 小时前
用 FastAPI + Vue3 打造一套完整的在线考试系统:从组卷到阅卷的业务闭环实践
后端·node.js·fastapi·it学习·wwwoop.com
小灰灰搞电子10 小时前
Rust+Slint 实现FTP客户端调试助手源码分享
开发语言·后端·rust
专业程序开发源11 小时前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计
卷无止境11 小时前
面向arm64桌面客户端开发全景:语言、框架与生态
后端·python
IT_陈寒12 小时前
JavaScript的闭包陷阱,这个坑我躺了三天才爬出来
前端·人工智能·后端
用户83562907805112 小时前
如何使用 Python 对 Excel 数据进行分组和分级显示
后端·python
vx_Biye_Design12 小时前
django房屋租赁推荐系统78455-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·课程设计·express