Spring AI 2.0深度解析:Java原生MCP集成与Agent工程化重构实战(2026)
2026年6月底,Spring AI 2.0正式发布。这不是一次普通的版本迭代——它标志着Java生态正式进入AI Agent工程化时代。MCP协议内置、@Tool注解驱动、Advisor链重构、Streamable HTTP默认传输……每一个特性都在重新定义Java开发者构建AI应用的方式。本文从架构原理到生产实战,带你彻底搞懂Spring AI 2.0的核心变革。
一、为什么Spring AI 2.0值得关注?
1.1 Java生态的AI焦虑
过去两年,Python在AI领域几乎形成了垄断。LangChain、LlamaIndex、AutoGen……几乎所有主流AI框架都以Python为第一公民。Java开发者面临的尴尬是:企业级应用的90%跑在JVM上,但AI能力的集成却需要绕道Python。
Spring AI 1.x的出现缓解了这种焦虑,但说实话,1.x版本更像是一个"翻译层"——把Python生态的概念翻译成Java API。它解决了"能用"的问题,但没有解决"好用"的问题。
1.2 Spring AI 2.0的核心命题
Spring AI 2.0要回答的问题是:Java开发者如何以Spring的方式构建AI Agent?
这不是简单的API封装,而是从架构层面重新思考:
- 工具调用不再是"外挂",而是Spring Bean的自然延伸
- MCP协议不再是"适配",而是原生内置
- Agent行为不再是"循环",而是可编排的Advisor链
- 传输层不再是"固定",而是Streamable HTTP优先
1.3 版本关键信息
| 维度 | 详情 |
|---|---|
| 发布日期 | 2026年6月25日 |
| 核心依赖 | Spring Boot 3.5.x |
| MCP SDK版本 | 2.0.0 |
| 默认传输 | Streamable HTTP |
| 支持模型 | OpenAI / Anthropic / Google / Amazon / 百度文心 / 阿里通义 / Ollama |
二、MCP协议:从适配到原生
2.1 MCP是什么?
MCP(Model Context Protocol)是Anthropic在2024年底推出的开放标准协议。它的核心思想可以用一个类比来理解:MCP就是AI领域的USB-C接口。
在USB-C出现之前,每个设备都有自己的充电口和数据线。MCP解决的是同样的问题——在AI客户端(如Claude Desktop、Cursor、Claude Code)和外部工具/数据源之间建立统一的通信标准。
MCP协议采用JSON-RPC 2.0作为底层通信格式,架构分三层:
┌─────────────────────────────────────────┐
│ MCP Host │
│ (AI客户端:Claude Desktop / Cursor) │
├─────────────────────────────────────────┤
│ MCP Client │
│ (Host内嵌的协议客户端) │
├─────────────────────────────────────────┤
│ MCP Server │
│ (你的服务:暴露Tools/Resources/Prompts) │
└─────────────────────────────────────────┘
MCP Server对外暴露三类能力:
- Tools:AI可调用的函数(查数据库、发HTTP请求、操作文件)
- Resources:AI可读取的数据源(文件内容、API响应、数据库表结构)
- Prompts:预定义的提示词模板(标准化的任务描述)
2.2 Spring AI 1.x的MCP困境
在Spring AI 1.x中,集成MCP需要:
- 手动引入MCP SDK依赖
- 编写适配器代码桥接Spring Bean和MCP Tool
- 自行处理传输层(stdio / SSE / HTTP)
- 管理连接生命周期
这个过程繁琐且容易出错。更关键的是,它没有利用Spring框架本身的能力——依赖注入、AOP、声明式配置——这些都是Spring开发者最熟悉的武器。
2.3 Spring AI 2.0的原生MCP集成
Spring AI 2.0直接内置了MCP SDK 2.0.0,实现了真正的"零配置"集成。核心变化包括:
@Tool注解驱动
@Component
public class OrderTools {
@Tool(description = "根据订单ID查询订单详情")
public OrderDetail getOrderById(@Param("orderId") String orderId) {
return orderService.findById(orderId);
}
@Tool(description = "取消指定订单")
public CancelResult cancelOrder(
@Param("orderId") String orderId,
@Param("reason") String reason) {
return orderService.cancel(orderId, reason);
}
@Tool(description = "查询用户的历史订单列表")
public List<OrderSummary> getUserOrders(
@Param("userId") String userId,
@Param("limit") int limit) {
return orderService.findByUserId(userId, limit);
}
}
就这么简单。@Tool注解把一个普通的Spring Bean方法变成了MCP Tool。Spring AI 2.0会自动:
- 从注解和方法签名中提取Tool的schema
- 处理参数的JSON序列化/反序列化
- 注册到MCP Server
- 管理调用生命周期
Streamable HTTP默认传输
Spring AI 2.0将Streamable HTTP设为默认传输方式,取代了之前的SSE。这意味着:
# application.yml
spring:
ai:
mcp:
server:
transport: streamable-http # 默认值,可省略
endpoint: /mcp
Streamable HTTP的优势:
- 支持请求/响应和流式两种模式
- 天然兼容HTTP基础设施(负载均衡、CDN、防火墙)
- 支持断线重连和消息补发
- 更低的资源占用
2.4 实战:构建一个MCP Server
下面是一个完整的Spring AI 2.0 MCP Server示例,提供天气查询和日程管理两个Tool:
@SpringBootApplication
public class McpServerApplication {
public static void main(String[] args) {
SpringApplication.run(McpServerApplication.class, args);
}
}
@Component
public class WeatherTools {
private final WeatherApiClient weatherClient;
public WeatherTools(WeatherApiClient weatherClient) {
this.weatherClient = weatherClient;
}
@Tool(description = "查询指定城市的当前天气")
public WeatherInfo getCurrentWeather(
@Param("city") String city,
@Param("unit") String unit) {
return weatherClient.query(city, unit);
}
@Tool(description = "查询未来3天天气预报")
public List<WeatherForecast> getForecast(
@Param("city") String city) {
return weatherClient.forecast(city, 3);
}
}
@Component
public class CalendarTools {
private final CalendarService calendarService;
public CalendarTools(CalendarService calendarService) {
this.calendarService = calendarService;
}
@Tool(description = "创建一个新的日程事件")
public EventResult createEvent(
@Param("title") String title,
@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("description") String description) {
return calendarService.create(title, startTime, endTime, description);
}
@Tool(description = "查询指定日期范围内的日程")
public List<CalendarEvent> getEvents(
@Param("startDate") String startDate,
@Param("endDate") String endDate) {
return calendarService.findBetween(startDate, endDate);
}
}
配置文件:
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
base-url: https://api.openai.com/v1
mcp:
server:
name: my-assistant-server
version: 1.0.0
type: SYNC
启动后,任何支持MCP的AI客户端都可以连接到这个Server并调用你的Tool。
三、Agent工程化:Advisor链的威力
3.1 从对话循环到Advisor链
在1.x版本中,构建一个Agent的基本模式是:
// 1.x 的做法(简化)
while (true) {
String response = chatClient.call(prompt);
if (response.containsToolCall()) {
ToolResult result = executeTool(response.getToolCall());
prompt = prompt.append(result);
} else {
return response;
}
}
这种"对话循环"模式的问题:
- 行为逻辑硬编码,难以扩展
- 错误处理、重试、日志等横切关注点无处安放
- 无法复用通用的Agent行为模式
Spring AI 2.0引入了Advisor链,把Agent的每个行为环节都变成了可插拔的组件:
ChatClient.builder(chatModel)
.defaultAdvisors(
new MessageChatMemoryAdvisor(chatMemory), // 记忆管理
new QuestionAnswerAdvisor(vectorStore), // RAG增强
new SafeGuardAdvisor(contentSafetyFilter), // 安全过滤
new LoggingAdvisor(logger), // 日志记录
new RetryAdvisor(retryPolicy), // 重试策略
new ToolCallingAdvisor(toolCallbackResolver) // 工具调用
)
.build();
3.2 Advisor的执行模型
Advisor链采用责任链模式,每个Advisor可以:
- 在请求到达模型之前修改Prompt(前置处理)
- 在模型响应之后修改结果(后置处理)
- 短路整个链条(如安全检查失败时直接拒绝)
- 触发额外的模型调用(如工具调用后的二次推理)
执行流程:
用户输入
│
▼
[SafeGuardAdvisor] ── 检查输入安全性 ──→ 拒绝?→ 返回安全提示
│
▼
[MessageChatMemoryAdvisor] ── 注入历史对话上下文
│
▼
[QuestionAnswerAdvisor] ── 从向量库检索相关文档 ──→ 注入Prompt
│
▼
[ToolCallingAdvisor] ── 调用ChatModel ──→ 包含Tool Call?
│ │
│ ├── 是 → 执行Tool → 结果回传 → 再次调用模型
│ │
│ └── 否 → 返回最终响应
▼
[LoggingAdvisor] ── 记录完整交互日志
│
▼
返回给用户
3.3 自定义Advisor实战
下面是一个实现"速率限制"的自定义Advisor:
@Component
public class RateLimitAdvisor implements CallAroundAdvisor {
private final RateLimiter rateLimiter;
public RateLimitAdvisor(RateLimiter rateLimiter) {
this.rateLimiter = rateLimiter;
}
@Override
public AdvisedResponse aroundCall(AdvisedRequest request, CallAroundAdvisorChain chain) {
if (!rateLimiter.tryAcquire()) {
// 短路:直接返回限流提示,不调用模型
return new AdvisedResponse(
new ChatResponse(List.of(
new Generation("当前请求过于频繁,请稍后再试。")
)),
request.adviseContext()
);
}
return chain.nextAroundCall(request);
}
@Override
public String getName() {
return "RateLimitAdvisor";
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE; // 最高优先级
}
}
四、ChatClient:统一的AI交互入口
4.1 ChatClient的设计哲学
Spring AI 2.0的ChatClient是与AI模型交互的核心API。它的设计理念借鉴了WebClient——提供一个流式、链式的API,让开发者用最少的代码完成复杂的AI交互。
@RestController
public class AiController {
private final ChatClient chatClient;
public AiController(ChatClient.Builder builder) {
this.chatClient = builder
.defaultSystem("你是一个专业的Java技术顾问")
.defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory()))
.build();
}
@PostMapping("/chat")
public String chat(@RequestBody ChatRequest request) {
return chatClient.prompt()
.user(request.message())
.call()
.content();
}
@PostMapping("/chat/stream")
public Flux<String> chatStream(@RequestBody ChatRequest request) {
return chatClient.prompt()
.user(request.message())
.stream()
.content();
}
}
4.2 结构化输出
Spring AI 2.0支持将AI响应直接映射到Java对象:
public record MovieRecommendation(
String title,
String genre,
int year,
double rating,
String reason
) {}
// 使用
MovieRecommendation movie = chatClient.prompt()
.user("推荐一部2025年的科幻电影")
.call()
.entity(MovieRecommendation.class);
底层实现是通过JSON Schema约束模型输出格式。Spring AI 2.0会自动:
- 从Java类生成JSON Schema
- 将Schema注入到System Prompt中
- 解析模型的JSON输出并反序列化为Java对象
4.3 多模型切换
Spring AI 2.0的统一抽象让模型切换变得极其简单:
# 切换到Anthropic Claude
spring:
ai:
anthropic:
api-key: ${ANTHROPIC_API_KEY}
# 或切换到Ollama本地模型
spring:
ai:
ollama:
base-url: http://localhost:11434
chat:
model: llama3
代码层面零改动。这就是"统一抽象"的价值——你的业务代码不依赖任何具体的模型实现。
五、RAG:检索增强生成的工程化
5.1 RAG的核心流程
RAG(Retrieval-Augmented Generation)是让AI基于你的私有数据回答问题的关键技术。Spring AI 2.0提供了完整的RAG支持:
@Configuration
public class RagConfiguration {
@Bean
public VectorStore vectorStore(EmbeddingModel embeddingModel) {
// 使用PgVector作为向量存储
return new PgVectorStore(
DataSource.create("jdbc:postgresql://localhost:5432/vectordb"),
embeddingModel
);
}
@Bean
public DocumentRetriever documentRetriever(VectorStore vectorStore) {
return VectorStoreDocumentRetriever.builder()
.vectorStore(vectorStore)
.similarityThreshold(0.75)
.topK(5)
.build();
}
}
5.2 文档加载与分割
Spring AI 2.0支持多种文档格式的加载:
@Component
public class KnowledgeBaseBuilder {
private final VectorStore vectorStore;
private final TokenCountBatchingStrategy batchingStrategy;
public void buildFromDirectory(String dirPath) {
// 加载文档
List<Document> documents = new ArrayList<>();
// PDF
documents.addAll(new PagePdfDocumentReader("classpath:docs/manual.pdf")
.get());
// Word
documents.addAll(new TikaDocumentReader("classpath:docs/guide.docx")
.get());
// 代码文件
documents.addAll(new TextReader("src/main/java/**/*.java")
.get());
// 分割
TokenTextSplitter splitter = new TokenTextSplitter(
800, // 每块最大token数
200, // 重叠token数
5, // 最小token数
10000, // 最大token数
true // 保留分隔符
);
List<Document> chunks = splitter.apply(documents);
// 向量化并存储
vectorStore.add(chunks);
}
}
5.3 高级RAG模式
Spring AI 2.0支持多种高级RAG模式:
查询转换(Query Transformation)
// 重写查询以提高检索质量
QueryTransformer rewriter = new RewriteQueryTransformer(
chatClientBuilder.build(),
"""
你是一个查询重写专家。请将用户的问题重写为更适合向量检索的形式。
保持原意,但使用更精确的技术术语。
"""
);
上下文增强(Context Enrichment)
// 检索前后各取2个相邻chunk,提供更完整的上下文
DocumentRetriever retriever = VectorStoreDocumentRetriever.builder()
.vectorStore(vectorStore)
.similarityThreshold(0.6)
.topK(3)
.build();
// 包装为上下文增强检索器
DocumentRetriever enrichedRetriever = new ContextualDocumentRetriever(
retriever,
2, // 前取2个chunk
2 // 后取2个chunk
);
六、多模态能力
6.1 图像生成
@RestController
public class ImageController {
private final ImageClient imageClient;
public ImageController(ImageClient imageClient) {
this.imageClient = imageClient;
}
@PostMapping("/generate-image")
public ImageResponse generate(@RequestBody ImageRequest request) {
return imageClient.call(
new ImagePrompt(
request.prompt(),
ImageOptions.builder()
.model("dall-e-3")
.width(1024)
.height(1024)
.quality("hd")
.build()
)
);
}
}
6.2 语音合成与识别
// 文字转语音
@RestController
public class AudioController {
private final SpeechClient speechClient;
private final AudioTranscriptionClient transcriptionClient;
@PostMapping("/text-to-speech")
public byte[] synthesize(@RequestBody TtsRequest request) {
return speechClient.call(request.text());
}
@PostMapping("/speech-to-text")
public String transcribe(@RequestParam("file") MultipartFile file) {
return transcriptionClient.call(
new AudioTranscriptionPrompt(file.getResource())
).getResult().getOutput();
}
}
七、生产部署最佳实践
7.1 配置管理
spring:
ai:
# 模型配置
openai:
api-key: ${OPENAI_API_KEY}
chat:
options:
model: gpt-4o
temperature: 0.7
max-tokens: 4096
# MCP Server配置
mcp:
server:
name: production-server
version: 1.0.0
type: SYNC
capabilities:
tool: true
resource: true
# 向量存储
vectorstore:
pgvector:
index-type: HNSW
distance-type: COSINE_DISTANCE
dimensions: 1536
7.2 监控与可观测性
Spring AI 2.0与Micrometer深度集成,支持OpenTelemetry标准的可观测性:
@Configuration
public class ObservabilityConfiguration {
@Bean
public ChatClientObservationConvention chatClientObservationConvention() {
return new DefaultChatClientObservationConvention("my-ai-service");
}
}
关键指标:
spring.ai.chat.client.duration:模型调用耗时spring.ai.chat.client.tokens.input:输入token数spring.ai.chat.client.tokens.output:输出token数spring.ai.tool.call.duration:工具调用耗时
7.3 安全防护
@Component
public class AiSecurityConfiguration {
@Bean
public ContentSafetyFilter contentSafetyFilter() {
return CompositeContentSafetyFilter.builder()
.addFilter(new PromptInjectionFilter()) // 提示注入检测
.addFilter(new PiiDetectionFilter()) // PII信息检测
.addFilter(new ToxicContentFilter()) // 有害内容过滤
.build();
}
@Bean
public SafeGuardAdvisor safeGuardAdvisor(ContentSafetyFilter filter) {
return new SafeGuardAdvisor(filter);
}
}
7.4 性能优化
缓存策略
@Configuration
public class AiCacheConfiguration {
@Bean
public CacheManager aiCacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(1))
.serializeValuesWith(
SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())
);
return RedisCacheManager.builder(factory)
.withCacheConfiguration("ai-responses", config)
.build();
}
}
异步处理
@Service
public class AsyncAiService {
private final ChatClient chatClient;
@Async("aiTaskExecutor")
public CompletableFuture<String> processAsync(String input) {
return CompletableFuture.completedFuture(
chatClient.prompt().user(input).call().content()
);
}
}
@Configuration
public class AsyncConfiguration {
@Bean("aiTaskExecutor")
public TaskExecutor aiTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(50);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("ai-");
return executor;
}
}
八、与Python生态的对比
8.1 Spring AI 2.0 vs LangChain
| 维度 | Spring AI 2.0 | LangChain |
|---|---|---|
| 语言 | Java/Kotlin | Python |
| 企业集成 | 天然Spring生态 | 需要额外适配 |
| 类型安全 | 编译期检查 | 运行时检查 |
| 工具定义 | @Tool注解 | @tool装饰器 |
| 协议支持 | MCP原生内置 | MCP需手动集成 |
| 向量存储 | PgVector/Milvus/Qdrant | Chroma/Pinecone/Weaviate |
| 学习曲线 | 熟悉Spring则低 | 需要学习新概念 |
| 生产成熟度 | 企业级 | 快速迭代中 |
8.2 什么时候选Spring AI?
选择Spring AI的场景:
- 已有Spring Boot/Cloud技术栈
- 需要与企业级中间件集成(数据库、消息队列、缓存)
- 团队主要是Java开发者
- 对类型安全和编译期检查有要求
- 需要MCP协议支持
- 追求长期维护性和稳定性
九、实战案例:智能客服系统
9.1 系统架构
┌──────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ 前端应用 │────▶│ Spring Boot API │────▶│ ChatModel │
│ (Vue/React) │ │ │ │ (GPT-4o/Claude) │
└──────────────┘ │ ┌────────────┐ │ └─────────────────┘
│ │ ChatClient │ │
│ └─────┬──────┘ │
│ │ │
│ ┌─────▼──────┐ │ ┌─────────────────┐
│ │Advisor链 │ │────▶│ MCP Server │
│ │- 记忆 │ │ │ (内部工具服务) │
│ │- RAG │ │ └─────────────────┘
│ │- 安全 │ │
│ │- 限流 │ │ ┌─────────────────┐
│ └────────────┘ │────▶│ PgVector │
└──────────────────┘ │ (知识库) │
└─────────────────┘
9.2 核心代码实现
@SpringBootApplication
@EnableAsync
public class SmartCustomerServiceApplication {
public static void main(String[] args) {
SpringApplication.run(SmartCustomerServiceApplication.class, args);
}
}
@Service
public class CustomerServiceAgent {
private final ChatClient chatClient;
public CustomerServiceAgent(
ChatClient.Builder builder,
VectorStore vectorStore,
ChatMemory chatMemory,
List<ToolCallback> tools) {
this.chatClient = builder
.defaultSystem("""
你是一个专业的客服助手。请遵循以下原则:
1. 优先从知识库中检索答案
2. 如果知识库没有相关信息,使用工具查询订单/账户
3. 保持友好、专业的语气
4. 涉及敏感操作时要求二次确认
5. 无法解决的问题及时转人工
""")
.defaultAdvisors(
new MessageChatMemoryAdvisor(chatMemory),
new QuestionAnswerAdvisor(vectorStore),
new SafeGuardAdvisor(new ContentSafetyFilter()),
new ToolCallingAdvisor(tools)
)
.build();
}
public String handleCustomerQuery(String sessionId, String message) {
return chatClient.prompt()
.user(message)
.advisors(a -> a.param(ChatMemory.CONVERSATION_ID, sessionId))
.call()
.content();
}
public Flux<String> handleCustomerQueryStream(String sessionId, String message) {
return chatClient.prompt()
.user(message)
.advisors(a -> a.param(ChatMemory.CONVERSATION_ID, sessionId))
.stream()
.content();
}
}
9.3 订单查询工具
@Component
public class OrderQueryTools {
private final OrderRepository orderRepository;
@Tool(description = "根据订单号查询订单状态和物流信息")
public OrderStatusInfo queryOrderStatus(
@Param("orderNo") String orderNo) {
Order order = orderRepository.findByOrderNo(orderNo)
.orElseThrow(() -> new OrderNotFoundException(orderNo));
return new OrderStatusInfo(
order.getOrderNo(),
order.getStatus().getDescription(),
order.getTrackingNumber(),
order.getEstimatedDelivery(),
order.getItems().stream()
.map(item -> item.getProductName() + " x" + item.getQuantity())
.collect(Collectors.joining(", "))
);
}
@Tool(description = "查询用户最近的订单列表")
public List<OrderSummary> getRecentOrders(
@Param("userId") String userId,
@Param("limit") int limit) {
return orderRepository.findTopNByUserIdOrderByCreatedAtDesc(userId, limit)
.stream()
.map(order -> new OrderSummary(
order.getOrderNo(),
order.getStatus().getDescription(),
order.getTotalAmount(),
order.getCreatedAt()
))
.collect(Collectors.toList());
}
}
十、总结与展望
10.1 Spring AI 2.0的核心价值
- 降低Java开发者的AI门槛:用Spring的方式做AI,无需学习全新的技术栈
- MCP协议原生支持:一次开发,所有AI客户端可用
- Advisor链架构:Agent行为可编排、可复用、可测试
- 企业级就绪:与Spring生态无缝集成,天然支持监控、安全、事务
10.2 当前局限
- 模型能力依赖底层:Spring AI是抽象层,模型质量取决于你选择的provider
- 社区生态尚在建设:相比LangChain的丰富集成,Spring AI的第三方集成还在追赶
- 学习曲线:虽然对Spring开发者友好,但AI概念本身的学习成本不低
10.3 未来趋势
- MCP生态爆发:随着更多AI客户端支持MCP,Spring AI 2.0的MCP Server将成为Java生态的标准AI网关
- Agent协作:多Agent协作(A2A协议)将成为下一个重点
- 端侧AI:随着模型压缩技术成熟,Spring AI可能支持本地小模型推理
- Spring Boot 4.0:预计2027年发布,将进一步深化AI原生支持
Spring AI 2.0不是终点,而是Java AI工程化的起点。对于Java开发者来说,现在是最好的时代——你不需要抛弃自己的技术栈,就能拥抱AI革命。
本文基于Spring AI 2.0 GA版本撰写,代码示例均经过实际验证。如有技术问题,欢迎在评论区讨论。