spring-web 是 Spring 框架的核心模块之一,主要负责处理 Web 应用开发中的通用基础设施。它不依赖于 Spring MVC,提供了很多底层但关键的功能。
以下是它的核心功能解析:
1. 核心特性与组件
-
HTTP 消息转换器
HttpMessageConverter接口是核心,负责将 HTTP 请求体转换为 Java 对象,以及将 Java 对象转换为 HTTP 响应体。内置实现包括处理 JSON(Jackson)、XML(JAXB)、表单数据、字节流、字符串等。
-
RestTemplate 同步客户端
传统的同步 HTTP 客户端,提供模板方法(
getForObject、postForEntity等)简化 HTTP 请求。虽然 Spring 5 新增了响应式WebClient,但许多旧项目仍在广泛使用。 -
异步非阻塞支持
提供了
Callable、DeferredResult及与CompletableFuture的集成,允许在 Servlet 容器中异步处理请求,提高线程利用率。 -
WebUtils 与工具类
例如
ServletRequestUtils用于解析请求参数、CookieGenerator管理 Cookie、HtmlUtils转义 HTML 等实用工具。 -
HTTP 请求/响应包装器
如
ContentCachingRequestWrapper,可以在拦截器中多次读取请求体(原生 Servlet 请求体只能读一次)。 -
Spring Web 注解
包括
@RequestPart(文件上传)、@RequestParam、@RequestHeader、@CookieValue等,用于数据绑定。(注意:
@Controller、@RequestMapping虽然常用,但实际定义在spring-webmvc或spring-webflux中)
2. 模块定位与区别
| 模块 | 作用 |
|---|---|
| spring-web | 基础 Web 功能,不依赖 Servlet 3.0+ 容器;提供通用 HTTP 客户端、消息转换、异步支持等。 |
| spring-webmvc | 基于 Servlet API 的 MVC 框架(通常说的 Spring MVC),依赖 spring-web。 |
| spring-webflux | 响应式 Web 框架,基于 Reactor Netty 或 Servlet 3.1+,同样依赖 spring-web。 |
3. 典型应用场景
-
编写 HTTP 客户端 (如调用外部 REST API)时使用
RestTemplate。 -
开发 非 MVC 的 Web 组件 ,比如自定义
Filter、Servlet时借助消息转换器处理 JSON。 -
构建 异步请求处理 的底层支持。
-
在 Spring MVC 或 WebFlux 中作为底层支撑,提供通用的 HTTP 抽象。
4. 版本演变注意
-
Spring 5 :全面支持响应式,引入
WebClient推荐替代RestTemplate(不过RestTemplate在 Spring 5 中仍可用,被标记为维护模式)。 -
Spring 6 :需要 Jakarta EE 9+ (
javax.servlet→jakarta.servlet),同时RestTemplate仍在,但官方更推荐WebClient或 HTTP Interface 客户端。
5. 简单代码示例
消息转换示例:手动使用 JSON 转换器
java
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
MyObject obj = new MyObject("test");
HttpOutputMessage msg = new MockHttpOutputMessage();
converter.write(obj, MediaType.APPLICATION_JSON, msg);
// msg.getBody() 得到 JSON 字符串
RestTemplate 用法(同步 GET 请求)
java
RestTemplate rest = new RestTemplate();
String result = rest.getForObject("https://api.example.com/data", String.class);
// 自动根据响应 Content-Type 选择消息转换器
异步请求处理(结合 DeferredResult)
java
@GetMapping("/async")
public DeferredResult<String> async() {
DeferredResult<String> dr = new DeferredResult<>();
CompletableFuture.supplyAsync(() -> "done").thenAccept(dr::setResult);
return dr;
}
// 此方法立即返回,释放容器线程,待异步完成后再响应
总结来说,spring-web 是 Spring Web 技术栈的 底层抽象层 ,提供了 HTTP 交互的通用组件,无论是同步还是响应式编程模型都依赖它。如果需要开发 Web 应用(带页面或 REST API),通常需要再组合 spring-webmvc 或 spring-webflux。