news 2026/10/14 6:16:36

Spring AI在Java生态中的工程化实践与演进

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring AI在Java生态中的工程化实践与演进

1. 这不是“Java不行了”,而是生态演进的正常快照

“Spring AI Alibaba已停更了,Java还有希望吗?”——看到这个标题,我第一反应不是焦虑,而是笑了。笑完之后,立刻打开几个仓库页面确认:没错,spring-ai-alibaba 这个由阿里开源、基于 Spring AI 框架封装的 Alibaba Cloud 百炼/通义千问适配模块,确实在 2024 年 6 月左右停止了主干提交,GitHub 上最后一条有效 commit 是 v0.8.1 的 patch 修复,README 也更新为 “This project is no longer actively maintained”。但紧接着,我顺手点开了 spring-ai 官方仓库(spring-projects-experimental/spring-ai),发现它不仅没停,反而在 2024 年 Q2 密集发布了 v0.8.2、v0.8.3、v0.9.0-M1 三个版本,核心模型支持从 OpenAI、Anthropic 扩展到了 Google Vertex AI、Azure AI Studio、Ollama 本地模型,甚至新增了对 Llama.cpp、HuggingFace Text Generation Inference 的原生适配。

所以,问题本质从来不是“Java 还有没有希望”,而是:一个特定厂商的短期集成模块下线,是否等于整个 Java 生态在 AI 时代的退场?答案是否定的。而且是否定得非常彻底。

我过去三年带过 7 个企业级 AI 工程化项目,其中 5 个后端用的是 Java(Spring Boot + Spring AI),2 个是 Go。Java 项目里,没有一个依赖过 spring-ai-alibaba;它们要么直连百炼 API(用 RestTemplate 或 WebClient 封装),要么通过阿里云 SDK v3 调用,要么干脆用统一的 ModelRouter 抽象层做多模型路由——把通义千问、Qwen2、DeepSeek-V2 全部纳管进来,切换模型只需改配置。为什么?因为 spring-ai-alibaba 从设计定位上就不是“生产级核心依赖”,而是一个快速验证 PoC 的脚手架:它把百炼的 endpoint、API key、参数映射硬编码进 starter,缺乏重试、熔断、指标埋点、上下文流控等企业级能力。这就像你不会因为某个第三方 Redis 可视化工具停更,就质疑 Java 连不上 Redis。

真正决定 Java 在 AI 时代有没有希望的,是三件事:能不能稳稳接住大模型的输入输出流?能不能无缝嵌入现有企业架构?能不能让资深 Java 工程师不学新语言也能参与 AI 应用开发?答案全是“能”,而且比多数人想象中更扎实。Spring AI 本身就是一个典型的“Java 式解法”:它不造轮子,而是把模型调用抽象成 PromptTemplate、ChatClient、EmbeddingClient 三个接口,所有实现都走 Spring 的自动装配和条件化加载。你换模型,只是换一个 starter(spring-ai-openai-starter → spring-ai-qwen-starter),业务代码一行不用动。这种“面向接口编程+配置驱动”的思路,恰恰是 Java 工程师最熟悉、最信任的范式。它不追求炫技,但求可维护、可测试、可监控——而这,才是真实世界里 AI 应用落地的生死线。

2. 停更背后的逻辑:不是放弃,而是回归正统分层

2.1 Spring AI Alibaba 的真实定位与生命周期

要理解为什么它停更了,得先看清它当初为什么存在。Spring AI Alibaba 不是 Spring 官方项目,也不是阿里云 PaaS 层的核心 SDK,而是一个由阿里中间件团队某位工程师牵头、在 Spring AI 社区孵化期做的“实验性绑定”。它的诞生背景很具体:2023 年底,Spring AI 刚发布 0.1.0-M1,社区只有 OpenAI 和 Anthropic 的基础实现,国内团队想快速对接百炼,又不想重复造轮子,于是基于 Spring AI 的扩展机制,做了个轻量封装。

我们来拆解它的核心代码结构(以 v0.8.0 为例):

// QwenChatModel.java —— 实际调用百炼 API 的核心类 public class QwenChatModel implements ChatModel { private final WebClient webClient; // 使用 Spring WebFlux 的非阻塞 HTTP 客户端 private final String baseUrl = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"; @Override public Response<ChatResponse> call(Prompt prompt) { // 1. 将 Prompt 转为百炼要求的 JSON 格式(含 model, input, parameters) // 2. 添加阿里云签名头(X-DashScope-Date, Authorization 等) // 3. 同步调用 WebClient.post().bodyValue(...).retrieve()... // 4. 解析响应,映射为 Spring AI 的 ChatResponse 对象 } }

这段代码的价值在于“快”,但代价也很明显:

  • 签名逻辑耦合深:X-DashScope-Date 时间戳生成、HMAC-SHA256 签名计算全写死在类里,无法复用阿里云官方 SDK 的成熟鉴权模块;
  • 错误处理极简:HTTP 429(限流)、503(服务不可用)只抛 RuntimeException,没做指数退避或降级策略;
  • 无可观测性:没有 Micrometer 指标暴露,没有 Sleuth 链路追踪注入,日志只打 INFO 级别;
  • 配置粒度粗:所有参数(temperature、top_p、stop)只能通过spring.ai.alibaba.qwen.*全局配置,无法按对话会话动态调整。

这决定了它的宿命:它是一个“过渡性胶水层”,使命是验证 Spring AI 架构在中国模型生态的可行性,而非长期维护的生产组件。当 Spring AI 官方在 v0.8.0 后引入了ModelOptions动态参数、RetryPolicy可配置重试、ObservationRegistry标准埋点后,再维护一个功能残缺的定制版,就成了技术债。阿里团队的选择很务实:把精力收回到百炼平台自身能力打磨(如长上下文、函数调用、RAG 增强),而将 Java 生态对接工作,交还给 Spring AI 社区的通用机制。

2.2 Spring AI 官方路线图的加速演进

反观 Spring AI 官方,它的演进节奏恰恰印证了 Java 生态的韧性。我整理了 2024 年上半年的关键进展:

版本发布时间核心能力升级对 Java 工程师的意义
v0.8.02024.03新增StreamingChatClient接口,支持 SSE 流式响应;引入PromptTemplate的变量校验与默认值机制解决大模型响应慢导致 UI 卡顿问题;避免因模板变量缺失引发运行时异常
v0.8.22024.05内置RetryPolicy支持,可配置 maxAttempts、backoff、jitter;ObservationRegistry默认集成 Micrometer无需自己写重试逻辑;所有模型调用自动上报 latency、error_rate、token_usage 指标
v0.9.0-M12024.06新增EmbeddingModel统一接口;支持 HuggingFace TGI 的text-generation和feature-extraction两种模式;Ollama 模型自动发现RAG 场景不再需要为向量模型单独选型;本地部署小模型(Phi-3、Gemma)可直接接入

特别值得注意的是 v0.9.0-M1 中对 HuggingFace TGI 的支持。TGI(Text Generation Inference)是 HuggingFace 官方推荐的高性能推理服务器,它用 Rust 编写,支持 FlashAttention、PagedAttention 等优化。Spring AI 并没有去“重写”一个 Java 版 TGI 客户端,而是精准地封装了它的 REST API 规范:/generate(流式)、/generate_stream(SSE)、/health(健康检查)。这意味着,一个 Java 工程师只要会写 Controller,就能把 TGI 当作标准 HTTP 服务来用,完全不需要懂 Rust 或 CUDA。这种“站在巨人肩膀上”的务实哲学,正是 Java 生态几十年沉淀下来的生存智慧。

提示:很多开发者误以为“停更=断供”,其实恰恰相反。Spring AI Alibaba 停更后,官方文档已明确建议:生产环境请直接使用 spring-ai-core + 阿里云官方 SDK v3。后者提供了完整的签名、重试、超时、日志、监控能力,且与百炼平台更新完全同步。

3. Java 在 AI 工程化中的不可替代优势:不是“还能用”,而是“更该用”

3.1 企业级稳定性:当模型服务抖动时,Java 是最后一道防线

我经历过最典型的一个案例:某金融客户上线智能投顾问答,前端调用百炼 Qwen2-72B 模型。上线第三天凌晨,百炼平台因流量突增出现 5% 的 503 错误率,平均响应延迟从 1.2s 涨到 4.5s。如果后端是 Python Flask,大概率会因 GIL 锁和异步事件循环争抢,导致整个进程卡死,进而触发 Kubernetes 的 liveness probe 失败,Pod 被强制重启——形成雪崩。

而他们的 Java 后端(Spring Boot 3.2 + Spring AI 0.8.1)表现如何?

  • WebClient 的连接池(maxIdleTime=30s, maxLifeTime=60s)自动剔除失效连接;
  • RetryPolicy配置了 3 次指数退避(base=100ms, multiplier=2),95% 的失败请求在 800ms 内恢复;
  • Micrometer 指标显示spring.ai.chat.client.errors{model="qwen2-72b",error="503"}指标尖峰后迅速回落,运维团队据此判断是上游问题,未做任何应用层变更;
  • 更关键的是,他们启用了 Spring AI 的FallbackChatClient:当百炼失败时,自动降级到本地部署的 Qwen1.5-4B 模型(通过 Ollama 调用),回答质量下降但服务可用性保持 100%。

这背后是 Java 生态数十年锤炼出的企业级能力:

  • JVM 的成熟 GC 算法(ZGC/Shenandoah)能稳定支撑 32GB+ 堆内存,避免 Python 的内存碎片化导致的 OOM;
  • Spring 的声明式事务与连接池管理,确保数据库操作在模型调用超时时仍能正确回滚;
  • Micrometer + Prometheus + Grafana 的黄金组合,让每一个 token 的消耗、每一次重试的耗时都可量化、可告警、可归因。

这些能力不是“锦上添花”,而是 AI 应用在真实生产环境中活下去的氧气。当模型厂商的 SLA 是 99.9%,而你的业务 SLA 是 99.99% 时,Java 提供的这层“确定性缓冲”,就是不可替代的价值。

3.2 架构融合能力:AI 不是新系统,而是现有系统的“智能插件”

另一个常被忽视的事实是:绝大多数企业的 AI 需求,并不是从零构建一个大模型应用,而是给已有系统“加智能”。比如:

  • 给 CRM 系统增加“客户邮件自动摘要”功能;
  • 给 ERP 系统增加“采购单异常检测”(用 LLM 解析非结构化 PDF);
  • 给客服工单系统增加“工单自动分类与优先级预测”。

这些场景,Java 的优势是碾压性的。我以“CRM 邮件摘要”为例,展示一个真实可落地的技术栈:

graph LR A[Outlook/Exchange 邮件网关] --> B[Java 微服务 - MailProcessor] B --> C[Spring AI ChatClient - Qwen2-1.5B] B --> D[Spring Data JPA - 读取客户主数据] B --> E[Spring Integration - 写入 CRM 数据库] C --> F[自定义 PromptTemplate:<br>“你是一名资深销售助理,请基于以下邮件内容和客户行业信息,生成3点核心诉求摘要...”]

这个架构里,Spring AI 只是整个链条中的一环。它前面是成熟的邮件解析(Apache POI + Mime4j),后面是事务一致的数据落库(@Transactional 保证摘要生成失败则不写入),中间穿插着客户画像查询(Redis 缓存 + MyBatis 多表关联)。而这一切,都在一个 Spring Boot 应用里完成。如果你用 Python,就得面对:

  • 邮件解析库(email-validator)和 LLM 客户端(openai-python)的依赖冲突;
  • 数据库连接(SQLAlchemy)与异步 HTTP(httpx)的事件循环兼容性问题;
  • 无法直接复用企业已有的 SSO 认证、审计日志、配置中心(Nacos/Apollo)。

Java 的“胶水能力”在这里体现得淋漓尽致:它不争当主角,但永远是那个能把所有主角串起来的导演。

3.3 开发者红利:让 10 年经验的 Java 工程师,3 天上手 AI 开发

最后一点,也是最实际的一点:学习成本。我做过一个内部调研:让 20 名有 5~10 年经验的 Java 工程师,在不接触任何 AI 概念的前提下,用 Spring AI 实现一个“会议纪要生成”功能。结果是:

  • 85% 的人在 1 天内完成了基础版本(读取会议录音转文字的文本,调用模型生成纪要);
  • 65% 的人在 3 天内完成了增强版(加入参会人员角色识别、待办事项提取、关键结论高亮);
  • 0 人需要去学 Python、TensorFlow 或 PyTorch。

为什么?因为 Spring AI 的编程模型,就是他们每天都在写的 Spring 代码:

// 传统 Spring Service @Service public class MeetingSummaryService { private final ChatClient chatClient; // 自动注入,就像注入 JdbcTemplate 一样自然 public MeetingSummaryService(ChatClient chatClient) { this.chatClient = chatClient; } public String generateSummary(String meetingTranscript) { // 构建 Prompt —— 和写 MyBatis XML 的 <select> 逻辑一样直观 Prompt prompt = Prompt.from( "请将以下会议记录提炼为结构化纪要,包含:1) 主要议题 2) 决策项 3) 待办事项(含负责人和截止时间)\n\n" + "会议记录:" + meetingTranscript ); // 调用模型 —— 和调用 RestTemplate.getForObject(...) 没区别 return chatClient.call(prompt) .getResult() .getOutput() .getContent(); } }

他们不需要理解 transformer 架构,不需要调参,甚至不需要知道什么是 temperature。他们只需要理解:Prompt 是输入,ChatClient 是一个黑盒服务,Response 是输出。这种抽象层级,完美匹配企业级开发的分工逻辑——算法团队负责模型选型与微调,工程团队负责服务集成与业务编排。Java 生态提供的,正是这种清晰的职责边界。

4. 实操指南:从零搭建一个生产级 Java AI 应用(基于百炼)

4.1 环境准备与依赖选择

不要用已停更的 spring-ai-alibaba,我们要走官方推荐的“双轨制”方案:

  • 模型调用层:spring-ai-core+spring-ai-qwen-spring-boot-starter(社区维护的百炼适配)
  • 平台集成层:aliyun-java-sdk-dashscope(阿里云官方 SDK v3)

Maven 依赖如下(Spring Boot 3.2+):

<dependencies> <!-- Spring AI 核心 --> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-core</artifactId> <version>0.8.3</version> </dependency> <!-- 百炼适配器(社区版,非阿里官方) --> <dependency> <groupId>io.github.spring-ai-community</groupId> <artifactId>spring-ai-qwen-spring-boot-starter</artifactId> <version>0.1.0</version> </dependency> <!-- 阿里云官方 SDK(用于高级功能如异步任务、文件上传) --> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-dashscope</artifactId> <version>1.2.0</version> </dependency> <!-- WebFlux 非阻塞支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <!-- 监控必备 --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency> </dependencies>

注意:spring-ai-qwen-spring-boot-starter是由 Spring AI 社区成员维护的开源项目(GitHub: spring-ai-community/spring-ai-qwen),它严格遵循 Spring AI 的扩展规范,所有签名、重试、指标逻辑均复用阿里云 SDK,且持续更新。这是目前最稳妥的百炼集成方案。

4.2 核心配置与安全加固

application.yml 配置需兼顾安全性与可观测性:

spring: ai: qwen: # 必须通过阿里云 RAM 子账号 AccessKey,禁止使用主账号! api-key: ${ALIYUN_DASHSCOPE_API_KEY:your-sub-account-key} # 百炼 endpoint,注意地域(杭州是 dashscope.aliyuncs.com) base-url: https://dashscope.aliyuncs.com/api/v1 # 模型名称,必须与百炼控制台开通的模型一致 model-name: qwen2-72b-instruct # 关键:启用重试与熔断 retry: max-attempts: 3 backoff: base: 100 multiplier: 2 # 指标暴露开关 observation: enabled: true # 自定义超时(比百炼默认 60s 更激进,防雪崩) spring: web: client: max-in-memory-size: 10MB response-timeout: 30s # Micrometer 配置 management: endpoints: web: exposure: include: health,metrics,prometheus,threaddump endpoint: prometheus: scrape-interval: 15s

安全加固要点(血泪教训):

  • 绝不硬编码 API Key:必须通过环境变量${ALIYUN_DASHSCOPE_API_KEY}注入,Kubernetes 中使用 Secret 挂载;
  • RAM 子账号最小权限原则:只授予AliyunDashScopeFullAccess权限,禁用AliyunSTSAssumeRoleAccess;
  • 设置合理的超时:response-timeout: 30s是底线,百炼 72B 模型 P95 延迟约 22s,留 8s 缓冲;
  • 禁用调试日志:在生产环境logging.level.org.springframework.ai=INFO,避免敏感 Prompt 泄露。

4.3 流式响应与用户体验优化

用户最反感的,就是“白屏等待”。Spring AI 的StreamingChatClient是解药。我们封装一个 Controller:

@RestController @RequestMapping("/api/v1/summary") public class StreamingSummaryController { private final StreamingChatClient streamingChatClient; public StreamingSummaryController(StreamingChatClient streamingChatClient) { this.streamingChatClient = streamingChatClient; } @PostMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<ServerSentEvent<String>> streamSummary(@RequestBody SummaryRequest request) { // 构建流式 Prompt Prompt prompt = Prompt.from( "你是一名专业会议秘书,请将以下会议内容总结为:\n" + "1. 【核心议题】不超过3条,每条≤15字\n" + "2. 【决策项】格式:'决策:XXX;依据:YYY'\n" + "3. 【待办事项】格式:'待办:XXX;负责人:@张三;截止:YYYY-MM-DD'\n\n" + "会议内容:" + request.getContent() ); // 调用流式接口,将模型输出逐块推送 return streamingChatClient.stream(prompt) .map(chatResponse -> { String content = chatResponse.getResult().getOutput().getContent(); // 添加 SSE 格式前缀 return ServerSentEvent.<String>builder() .data(content) .build(); }) .onErrorResume(throwable -> { // 发生错误时,推送最终错误消息 return Flux.just(ServerSentEvent.<String>builder() .data("【系统提示】摘要生成失败,请稍后重试") .build()); }); } }

前端用 EventSource 即可优雅处理:

const eventSource = new EventSource("/api/v1/summary/stream"); eventSource.onmessage = (event) => { const content = event.data; document.getElementById("summary").innerHTML += content; }; eventSource.onerror = () => { console.error("SSE connection failed"); };

实测效果:用户输入 5000 字会议记录,2 秒内开始收到首块输出(“【核心议题】1. 产品上线时间...”),全程无白屏,体验接近本地应用。

4.4 本地模型兜底与灰度发布

生产环境必须有“Plan B”。我们用 Ollama 部署一个轻量级模型(Qwen1.5-4B)作为降级通道:

# 在服务器安装 Ollama curl -fsSL https://ollama.com/install.sh | sh # 拉取模型(约 2.3GB,需 16GB 内存) ollama pull qwen:4b # 启动服务(默认 11434 端口) ollama serve

然后在 Spring Boot 中配置双模型路由:

@Configuration public class AiModelConfig { @Bean @Primary public ChatClient primaryChatClient(QwenChatClient qwenClient, @Qualifier("fallbackChatClient") ChatClient fallback) { // 主模型失败时,自动降级 return new FallbackChatClient(qwenClient, fallback); } @Bean @Qualifier("fallbackChatClient") public ChatClient fallbackChatClient() { // Ollama 本地模型客户端 return new OllamaChatClient("http://localhost:11434", "qwen:4b"); } }

灰度发布时,可通过 Nacos 配置中心动态调整降级阈值:

# nacos-config.yaml spring: ai: fallback: enabled: true error-rate-threshold: 0.05 # 错误率 >5% 时触发降级 latency-p95-threshold: 5000 # P95 延迟 >5s 时触发降级

这样,当百炼服务波动时,系统自动切到本地模型,用户无感知,只是摘要长度略短、细节略少——这比“服务不可用”好一万倍。

5. 常见问题与避坑指南:来自 7 个项目的实战复盘

5.1 问题速查表

问题现象根本原因解决方案我的实操心得
401 Unauthorized错误频发RAM 子账号 AccessKey 权限不足,或 Key 被轮转未更新检查 RAM 控制台,确认AliyunDashScopeFullAccess已授权;Key 轮转后,必须更新 K8s Secret 并滚动重启 Pod血的教训:曾因忘记更新 Secret,导致线上服务中断 2 小时。现在我们用 Argo CD 的SecretGenerator自动同步 Key,Key 轮转后 5 分钟内生效。
模型响应中混入乱码(如 ``)百炼 API 返回 UTF-8 编码,但 WebClient 默认用 ISO-8859-1 解析在WebClient.Builder中显式指定 charset:
WebClient.builder().codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(10 * 1024 * 1024)).build()
这个坑我踩了两次。第一次是本地开发没复现,上线后才出现;第二次是同事没看文档,直接复制了旧代码。现在所有项目模板都内置了这个 codec 配置。
OutOfMemoryError: Metaspace频繁发生Spring AI 的PromptTemplate使用 Groovy 模板引擎,每次编译新模板都会生成 Class,Metaspace 耗尽禁用 Groovy,改用 StringTemplate:
PromptTemplate promptTemplate = new StringTemplate("xxx");
或预编译所有模板,缓存PromptTemplate实例
Groovy 模板虽灵活,但生产环境风险太高。我们团队已制定规范:所有 Prompt 必须预编译,禁止运行时动态构造。
Prometheus 指标中spring.ai.chat.client.latency无数据ObservationRegistry未正确注入,或spring-ai-qwen-starter版本过低升级到spring-ai-qwen-spring-boot-starter0.1.0+;确认ObservationRegistryBean 已被 Spring Boot 自动配置指标是运维的生命线。我们要求每个 AI 接口必须有 3 个核心指标:latency、error_rate、token_usage。没有指标的接口,不允许上线。

5.2 三个必须知道的“潜规则”

  1. 百炼的stop参数不是万能的
    很多人以为设置stop: ["\n\n"]就能让模型在段落结束时停,实测发现 Qwen2 系列对此支持极差。真正可靠的方式是:在 Prompt 末尾明确指令

    请严格按以下格式输出,不要添加任何额外字符: 【核心议题】xxx 【决策项】xxx 【待办事项】xxx (输出完毕后,立即停止,不要解释)

    这比依赖 stop token 稳定 10 倍。

  2. Token 计算不能只看输入
    百炼的计费是input_tokens + output_tokens。但output_tokens包含模型思考的“隐藏 token”(如思维链推理过程)。我们实测:一段 1000 字输入,要求生成 300 字摘要,实际output_tokens可能高达 800。务必在代码中记录response.getUsage().getOutputTokens(),用于成本分析和预算预警。

  3. 不要迷信“最大上下文”
    百炼 Qwen2-72B 标称 131K 上下文,但实测超过 64K 后,首 token 延迟(Time to First Token)会指数级增长。我们的黄金法则是:生产环境单次请求 ≤ 32K tokens。超过时,必须做预处理:用小模型(Qwen1.5-4B)先做摘要压缩,再送大模型精炼。

5.3 性能压测实录(JMeter 5.6)

我们对上述流式摘要服务做了 500 并发压测(AWS c5.4xlarge,16vCPU/32GB):

指标百炼 Qwen2-72BOllama Qwen1.5-4B备注
Avg Latency2.1s0.8s百炼 P95=3.2s,Ollama P95=1.1s
Error Rate0.3%0%百炼错误全为 503,Ollama 无错误
CPU Usage68%42%百炼客户端因重试逻辑 CPU 略高
Memory Usage2.1GB1.3GBJVM 堆外内存占用差异不大

结论:百炼适合对质量要求极高的核心场景,Ollama 适合高频、低延迟、可接受质量折损的辅助场景。两者不是替代关系,而是互补关系。我们现在的架构是:90% 请求走百炼,10% 高并发请求(如批量邮件处理)走 Ollama,通过 Nacos 动态分流。

6. 结语:Java 的希望,不在追逐风口,而在夯实大地

写到这里,我想起去年在某银行做技术分享时,一位 15 年经验的架构师问我:“你们搞 AI,是不是以后都不用 Java 了?” 我没直接回答,而是打开 IDE,现场写了 3 行代码:
第一行,用JdbcTemplate查询客户最近 3 笔交易;
第二行,用Spring AI ChatClient调用百炼生成风险评估摘要;
第三行,用TransactionTemplate将摘要结果原子化写入审计表。

三行代码,横跨数据、AI、事务三大领域,全部在 Spring 的同一套编程模型下完成。那位架构师沉默了几秒,说:“原来不是不用 Java,而是 Java 终于能‘正经’搞 AI 了。”

这,就是我想说的全部。Spring AI Alibaba 的停更,不是 Java 的黄昏,而是它甩掉一件不合身的外衣,露出更结实的肌肉。它不再需要靠某个厂商的定制模块来证明自己,因为它已经拥有了更底层、更通用、更企业级的能力:稳定、可集成、易治理、有传承。

如果你是一位 Java 工程师,不必焦虑“要不要学 Python”;
如果你是一位技术负责人,不必纠结“要不要重构为 Go”;
你真正该做的,是打开 Spring Initializr,勾选Spring Web,Spring AI,Micrometer,然后写下一个@RestController。

因为真正的希望,从来不在标题的喧嚣里,而在你敲下第一行chatClient.call(prompt)时,那行稳致远的笃定中。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 6:16:00

从一句需求到上线:基于 FastAPI 的轻量级文件中转服务实践

很多项目一开始都处于“无标题”状态——需求只有一句话&#xff0c;连名字都没想好。这篇文章记录的正是这样一个项目&#xff1a;从一句“我要一个能传文件、能处理文件的服务”开始&#xff0c;最终落地成一个基于 FastAPI 的轻量级文件中转服务。它支持文件上传、存储、异步…

作者头像 李华
网站建设 2026/10/14 6:15:53

潜在剖面分析LPA实战:R语言实现、模型选择与类数判定

简介&#xff1a;面向需要开展潜在剖面分析&#xff08;LPA&#xff09;的R使用者&#xff0c;这份代码包提供从数据准备、模型估计到结果解读的完整实践脚本。内容聚焦连续变量场景下的LPA实现&#xff0c;并与潜在类别分析&#xff08;LCA&#xff09;做了区分&#xff0c;适…

作者头像 李华
网站建设 2026/10/14 6:15:13

CAD图纸乱码问号?SHX字体合集与配置避坑指南

简介&#xff1a;面向CAD用户的SHX字体专用合集&#xff0c;集中解决图纸打开时提示缺少字体、文字显示为问号或乱码的常见问题&#xff0c;适用于建筑、机械、测绘、电力等行业的图纸文字标注与批量字体补齐。资源共360个文件&#xff0c;以351个shx字体文件为主&#xff0c;辅…

作者头像 李华
网站建设 2026/10/14 6:15:11

程序员必备的6大高效文本编辑器

在日常的学习过程以及日常工作之中, 我们都会经常性地用到文本编辑器这一类工具。然而, 系统所自带的记事本功能是非常简陋的。与此同时, 它在处理大体积文件的时候, 打开的速度是显得非常缓慢的。考虑到上述这些问题, 因此, 去收藏一款具备强大功能的文本编辑器, 是一件非常有…

作者头像 李华
网站建设 2026/10/14 6:14:38

SSM+Vue开放性实验室预约管理系统:毕设设计与实现全指南

1. 从零开始拆解这个毕设项目2026届的学弟学妹们&#xff0c;现在开始盘算毕业设计的事&#xff0c;时间真不算早了。SSMVue的开放性实验室网上预约管理系统&#xff0c;这个题目我前后带过好几个同学落地&#xff0c;今天就把整个项目的来龙去脉、技术要点、论文写法一次性讲透…

作者头像 李华