Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP------Java 工程师的 AI 落地最优解
📚 本文是「Java 大模型框架专题」系列第 2 篇。全系列 5 篇,建议按序阅读:
- 总纲 2026 Java 大模型框架选型终极指南:Spring AI vs LangChain4j vs AgentScope Java 深度横评
- 深度 Spring AI 2.0 深度解析(本篇)
- 深度 LangChain4j 深度解析
- 深度 AgentScope Java 深度解析
- 实战 同一需求三套写法:带工具调用的 RAG 助手三框架实战对比
写在前面:为什么 2.0 值得单独写一篇
很多文章把 Spring AI 讲成"Spring 版的 LangChain",一笔带过。但 Spring AI 2.0(2026-06-12 GA)是一次"重写级"升级,它的三个变化直接决定了 Spring 团队未来三五年的 AI 技术路线。这篇把这三件事讲透,并给出可抄的代码与踩坑清单。
一、2.0 到底改了什么:一张迁移全景
| 维度 | 1.x | 2.0 |
|---|---|---|
| 核心入口 | ChatModel.call() |
ChatClient (ChatModel 降为底层构件) |
| 工具调用 | 散落在各模型实现 | Advisor 链 (ToolCallingAdvisor 自动注册) |
| MCP | 附加模块 | 核心内置 (@McpTool/@McpResource/@McpPrompt) |
| 运行底座 | Spring Boot 3.x | Spring Boot 4.x + Framework 7.0 + Jackson 3 |
| 空安全/选项 | 常规 | JSpecify 全量空安全 + 不可变 Options Builder |
⚠️ 最硬的一条约束 :Spring AI 2.0 跑不了 Boot 3.x。Boot 3.5 团队只能留在 1.1.x 分支。这一条,几乎决定了"你什么时候能用上 2.0"。
二、ChatClient:从"模型"到"入口"的范式跃迁
1.x 时代你脑子里是"我先拿到一个 ChatModel,再拼 prompt";2.0 把它反过来了------你先拿到一个 ChatClient,剩下的交给链。
java
// 1.x 的写法:面向模型
String resp = chatModel.call(
new Prompt("你是谁?", OpenAiChatOptions.builder().temperature(0.7).build())
).getResult().getOutput().getText();
// 2.0 的写法:面向 ChatClient(Fluent 链式)
String resp = chatClient.prompt()
.system("你是资深 Java 架构师")
.user("解释一下 Spring AI 2.0 的 Advisor 链")
.call()
.content();
这个变化的价值不在语法糖,而在"横切能力"有了统一的挂载点 ------system/user/工具/检索/上下文压缩,全都能以 Advisor 的形式插到 ChatClient 上,而不是散落各处。
流式输出
java
// 返回 Flux<String>,直接接 SSE / WebFlux
@GetMapping(value = "/ask", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
Flux<String> stream(@RequestParam String q) {
return chatClient.prompt().user(q).stream().content();
}
结构化输出(自纠错)
2.0 对"让模型返回结构化对象"做了自纠错处理------解析失败会自动把校验错误回喂模型重试,这是生产里"AI 返回脏数据"的常见痛点。
java
record Weather(String city, int temp, String summary) {}
Weather w = chatClient.prompt()
.user("今天杭州天气怎么样?")
.call()
.entity(Weather.class); // 自动解析 + 失败自纠错
三、Advisor 链:把横切能力从模型里"抽出来"
这是 2.0 架构演进的核心。过去"工具调用"是各个 ChatModel 实现各写各的;2.0 统一成可组合、可循环的 Advisor 链。

一次"模型需要调工具"的完整循环是:
- 用户请求进入
ChatClient; - Advisor 链逐个执行(
ToolCallingAdvisor、QuestionAnswerAdvisor等); - 模型返回"我想调用某个工具"的指令;
ToolCallingAdvisor执行对应@Tool方法,把结果回填上下文;- 再次请求模型,直到模型决定"不再需要工具"、给出最终答案。
关键价值:工具调用从"模型的能力"变成了"Advisor 的能力"。你要控制"最多调几轮工具""几百个工具怎么检索",换 Advisor 即可,不用换模型。
java
// 声明式工具:一个 @Bean 即可被 ToolCallingAdvisor 自动发现
@Component
class TimeTools {
@Tool(description = "返回当前 UTC 时间")
String now() { return Instant.now().toString(); }
}
// 自定义 Advisor:比如给每次请求塞一段统一的系统提示
class SafetyAdvisor implements CallAroundAdvisor {
// 在模型调用前注入安全约束,调用后做合规检查
}
四、MCP 核心化:Client 与 Server 双向
2.0 把 MCP 从附加模块搬进核心,并给出声明式注解,让你的 Spring 应用既能当 MCP 客户端,也能当 MCP 服务端。
java
// 当 MCP 服务端:把某个 Bean 方法暴露成 MCP 工具
@McpTool(description = "查询订单状态")
String orderStatus(@ToolParam String orderId) {
return orderService.status(orderId);
}
这意味着:你今天用 @McpTool 封装的工具,未来可以跨框架复用(LangChain4j、AgentScope 也都支持 MCP)。选型对"工具层"的锁定风险,正在被 MCP 这条标准逐渐消解。
五、Boot 4 迁移:绕不开的硬仗
Spring AI 2.0 依赖 Spring Boot 4 + Framework 7 + Jackson 3,这是一次平台级升级,不是换个版本号。
迁移建议路径:
- 先评估 Boot 4 迁移本身:这是独立于 Spring AI 的一件大事,别被"想用 2.0"这个动机绑架节奏;
- 过渡期:Boot 3.5 团队继续用 Spring AI 1.1.x,它仍在维护;
- 或走混合:底座暂不迁,用 LangChain4j 的双 Starter(Boot 3.5+/Boot 4 都支持)先落地 AI 能力,Boot 4 迁完再切回 Spring AI 2.0。
六、最佳实践与反模式
✅ 做 :用 ChatClient 作为唯一入口;工具一律 @Tool 声明;把 RAG 挂在 QuestionAnswerAdvisor 上;观测接入 Actuator/Micrometer。
❌ 别做 :直接 new ChatModel 绕过 Advisor 链;在 Boot 3.x 上硬上 2.0(直接启动失败);把业务逻辑写进 @Tool 方法里(工具应保持无副作用、可重入)。
七、什么时候选 Spring AI(回顾决策树)
一句话:你已是 Spring 重度用户、且已/计划迁 Boot 4,目标是给现有业务加"对话 / RAG / 工具调用"这类单体智能------选 Spring AI 最省心。其余场景,参考系列第 1 篇的决策树。
系列矩阵导航
- 🔗 第 1 篇·总纲 三框架选型深度横评(含分层定位图 + 决策树)
- 🔗 第 3 篇·深度 LangChain4j 深度解析
- 🔗 第 4 篇·深度 AgentScope Java 深度解析
- 🔗 第 5 篇·实战 同一需求三套写法:RAG 助手三框架实战对比
本文数据截至 2026-11-02;API 细节以 Spring AI 官方文档 为准。