开篇
很多人用 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,三者的执行顺序到底怎么排。
想继续看就点关注,这个系列会一直更下去。