Spring Web 概览
Spring Web 在应用层的定位:IoC、MVC 请求处理与何时引入;不替代语言主线。
[!info] related notes
- 所属 MOC:Web 后端 · 学习路线
- 前置概念:标准库 HTTP 服务 · 异常 · 分层
- 后续概念:Spring Boot · 数据访问
- 容易混淆:Spring 生态 = Java 语言
Spring Web 概览
这个概念为什么出现
企业 Java Web 多数运行在 Spring 生态。它提供依赖注入、Web MVC、生态集成。但若跳过语言与 HTTP 底座,排障只能停在“注解魔法”。
[!abstract] 一句话理解 Spring Framework 提供 IoC/DI 基础;Spring MVC 通过 Servlet 栈的 DispatcherServlet 处理请求,WebFlux 是另一套响应式 Web 栈。它们属于应用框架层,不是 Java 语言功能。
最小可运行示例
场景:用纯 Java 验证构造注入与委托
这是单文件可运行的适配器示例,不启动 Spring 或 HTTP 服务。省略 public 的接口可与 public 类放在同一文件中。
// 仅演示构造注入;无 Spring 依赖。
interface PlaceOrderUseCase {
String place(String skuId, int qty);
}
public class OrderControllerAdapter {
private final PlaceOrderUseCase useCase;
public OrderControllerAdapter(PlaceOrderUseCase useCase) {
this.useCase = useCase;
}
// @PostMapping("/orders") 在真实 Spring 中绑定
public String place(String skuId, int qty) {
return useCase.place(skuId, qty);
}
public static void main(String[] args) {
PlaceOrderUseCase uc = (sku, q) -> "ok-" + sku + "-" + q;
System.out.println(new OrderControllerAdapter(uc).place("S1", 1));
}
}
javac OrderControllerAdapter.java && java OrderControllerAdapter
期望:
ok-S1-1
结合场景再看三个关注点
- 用例与 Web 适配分离。
- DI 构造注入便于测试。
- 先懂 HTTP 语义再学注解映射。
核心概念与准确模型
1. IoC/DI
容器负责创建和连接受管理组件;构造注入也可以像本例一样手动完成。仅在普通对象上添加注解,不代表对象已被容器管理或代理。
2. Spring MVC 请求链路(简化)
Servlet filters → DispatcherServlet → HandlerMapping/HandlerAdapter → Controller → 返回值处理。返回值可能经视图解析,也可能经 HttpMessageConverter 写入响应体;异常另经解析链处理。
3. Boot 的自动配置
约定与 starter 依赖,见 Spring Boot。
4. WebMVC vs WebFlux
MVC 基于 Servlet API;WebFlux 提供非阻塞、响应式模型,常用少量事件循环线程,不能直接在其上执行阻塞 JDBC 调用。MVC 是否使用虚拟线程取决于 JDK、服务器与显式配置,并非因为使用 Spring 就默认开启;虚拟线程也不会把 MVC 变成 WebFlux。
边界情况与反直觉行为
- 过滤器/拦截器顺序。
- 默认代理式事务中,同一对象内部自调用绕过代理,内层方法的事务注解不会新建所期待的边界;外层已有事务仍可能继续生效。
- 启动变慢与组件扫描范围。
常见误区
[!warning] 常见误区:不会 Java 只背 Spring 注解 类型擦除、代理、类加载、异常仍决定排障能力。
工程实践
- 控制器变薄。
- 配置与密钥外置。
- Actuator 健康与指标。
- 与标准库服务对照学习。
本节总结
- Spring=应用框架层
- DI + MVC 主线
- 语言主线不可替代
自测题
- 为什么构造注入优于字段注入(测试角度)?
- Spring 与 JDK HttpServer 如何分工学习?
参考答案
- 可在测试中直接 new 并传入假依赖,不启动容器。
- 先 HttpServer 懂语义,再 Spring 学装配与生态。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| Spring Web docs | 官方 | Web 栈 |
| Spring Boot Reference | 官方 | Boot |