Spring-web 解析

spring-web 是 Spring 框架的核心模块之一,主要负责处理 Web 应用开发中的通用基础设施。它不依赖于 Spring MVC,提供了很多底层但关键的功能。

以下是它的核心功能解析:

1. 核心特性与组件

  • HTTP 消息转换器
    HttpMessageConverter 接口是核心,负责将 HTTP 请求体转换为 Java 对象,以及将 Java 对象转换为 HTTP 响应体。

    内置实现包括处理 JSON(Jackson)、XML(JAXB)、表单数据、字节流、字符串等。

  • RestTemplate 同步客户端

    传统的同步 HTTP 客户端,提供模板方法(getForObjectpostForEntity 等)简化 HTTP 请求。虽然 Spring 5 新增了响应式 WebClient,但许多旧项目仍在广泛使用。

  • 异步非阻塞支持

    提供了 CallableDeferredResult 及与 CompletableFuture 的集成,允许在 Servlet 容器中异步处理请求,提高线程利用率。

  • WebUtils 与工具类

    例如 ServletRequestUtils 用于解析请求参数、CookieGenerator 管理 Cookie、HtmlUtils 转义 HTML 等实用工具。

  • HTTP 请求/响应包装器

    ContentCachingRequestWrapper,可以在拦截器中多次读取请求体(原生 Servlet 请求体只能读一次)。

  • Spring Web 注解

    包括 @RequestPart(文件上传)、@RequestParam@RequestHeader@CookieValue 等,用于数据绑定。

    (注意:@Controller@RequestMapping 虽然常用,但实际定义在 spring-webmvcspring-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 组件 ,比如自定义 FilterServlet 时借助消息转换器处理 JSON。

  • 构建 异步请求处理 的底层支持。

  • Spring MVC 或 WebFlux 中作为底层支撑,提供通用的 HTTP 抽象。

4. 版本演变注意

  • Spring 5 :全面支持响应式,引入 WebClient 推荐替代 RestTemplate(不过 RestTemplate 在 Spring 5 中仍可用,被标记为维护模式)。

  • Spring 6 :需要 Jakarta EE 9+javax.servletjakarta.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-webmvcspring-webflux

相关推荐
小林ixn1 小时前
从 onclick 到 React 合成事件,再到完整应用逻辑:一次前端架构的深度剖析
前端·react.js·前端框架
Csvn1 小时前
🧩「找不到模块」排查全记录——Monorepo 下 TypeScript 路径别名的 5 种「不通」与根治方案
前端
腻害兔2 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
CodexDave2 小时前
MySQL事务隔离级别与MVCC机制解析
前端·数据库·mysql·nginx·性能优化·负载均衡
碎光拾影2 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Ai_easygo3 小时前
AI Agent开发入门——从ReAct到Tool Calling,拆解Agent的底层运行逻辑
前端·人工智能·react.js
研☆香3 小时前
分析制作html页面,如何划分页面结构
前端
Miao121313 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔3 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
kyriewen3 小时前
我扒了最近的前端面经——2026年面试不背八股文了,考这5样
前端·面试·ai编程