Spring AI 代码分析(十)--Spring Boot集成

news/2025/11/28 20:42:57/文章来源:https://www.cnblogs.com/wasp520/p/19284118

Spring Boot 集成分析

请关注微信公众号:阿呆-bot

1. 工程结构概览

Spring AI 通过 Spring Boot Starter 和 Auto Configuration 机制,实现了零配置的 AI 应用开发。开发者只需要添加依赖和配置属性,就能使用各种 AI 能力。

spring-ai-spring-boot-starters/  # Starter 模块
├── spring-ai-starter-model-openai/      # OpenAI Starter
├── spring-ai-starter-model-ollama/        # Ollama Starter
├── spring-ai-starter-vector-store-pgvector/  # PGVector Starter
└── ... (50+ 个 Starter)auto-configurations/              # 自动配置模块
├── models/                      # 模型自动配置
│   ├── spring-ai-autoconfigure-model-openai/
│   ├── spring-ai-autoconfigure-model-ollama/
│   └── ...
├── vector-stores/               # 向量存储自动配置
│   ├── spring-ai-autoconfigure-vector-store-pgvector/
│   └── ...
├── common/                      # 通用自动配置
│   ├── spring-ai-autoconfigure-retry/
│   └── spring-ai-autoconfigure-model-tool/
└── mcp/                         # MCP 自动配置

2. 技术体系与模块关系

Spring Boot 集成采用 Starter + Auto Configuration 模式:

image.png

3. 关键场景示例代码

3.1 最简单的使用

只需要添加依赖和配置:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
spring:ai:openai:api-key: ${OPENAI_API_KEY}chat:options:model: gpt-4
@RestController
public class ChatController {@Autowiredprivate ChatModel chatModel;  // 自动注入@GetMapping("/chat")public String chat(String message) {return chatModel.call(message);}
}

3.2 配置属性

所有配置都通过 application.ymlapplication.properties

spring:ai:openai:api-key: ${OPENAI_API_KEY}base-url: https://api.openai.comchat:options:model: gpt-4temperature: 0.7max-tokens: 1000embedding:options:model: text-embedding-3-small

3.3 条件装配

自动配置会根据条件决定是否启用:

@AutoConfiguration
@ConditionalOnClass(OpenAiChatModel.class)
@ConditionalOnProperty(prefix = "spring.ai.openai.chat",name = "enabled",havingValue = "true",matchIfMissing = true
)
public class OpenAiChatAutoConfiguration {// ...
}

3.4 自定义 Bean

可以覆盖自动配置的 Bean:

@Configuration
public class CustomConfig {@Bean@Primarypublic ChatModel customChatModel() {// 自定义实现return new CustomChatModel();}
}

4. 核心实现图

4.1 自动配置流程

image.png

5. 入口类与关键类关系

image.png

6. 关键实现逻辑分析

6.1 Starter 设计

Starter 是一个空的 Maven 模块,只包含依赖:

<dependencies><!-- 核心实现 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai</artifactId></dependency><!-- 自动配置 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-autoconfigure-model-openai</artifactId></dependency><!-- 通用自动配置 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-autoconfigure-retry</artifactId></dependency>
</dependencies>

Starter 的优势:

  • 简化依赖管理:用户只需要添加一个依赖
  • 版本统一:所有相关依赖版本统一管理
  • 功能完整:包含所有必需的依赖

6.2 自动配置类实现

自动配置类使用条件注解:

@AutoConfiguration
@ConditionalOnClass(OpenAiChatModel.class)
@ConditionalOnProperty(prefix = "spring.ai.openai.chat",name = "enabled",havingValue = "true",matchIfMissing = true
)
@EnableConfigurationProperties(OpenAiChatProperties.class)
public class OpenAiChatAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic OpenAiChatModel chatModel(OpenAiChatProperties properties,RetryTemplate retryTemplate,RestClient.Builder restClientBuilder) {// 1. 构建 API 客户端OpenAiApi openAiApi = new OpenAiApi(properties.getBaseUrl(),properties.getApiKey(),restClientBuilder,retryTemplate);// 2. 创建 ChatModelreturn new OpenAiChatModel(openAiApi,properties.getChat().getOptions());}@Bean@ConditionalOnMissingBeanpublic OpenAiChatOptions chatOptions(OpenAiChatProperties properties) {return properties.getChat().getOptions();}
}

关键注解说明

  • @AutoConfiguration:标记为自动配置类
  • @ConditionalOnClass:只有当类路径存在指定类时才启用
  • @ConditionalOnProperty:只有当配置属性满足条件时才启用
  • @ConditionalOnMissingBean:只有当容器中不存在指定 Bean 时才创建
  • @EnableConfigurationProperties:启用配置属性绑定

6.3 配置属性绑定

配置属性类使用 @ConfigurationProperties

@ConfigurationProperties(prefix = "spring.ai.openai")
public class OpenAiChatProperties {private String apiKey;private String baseUrl = "https://api.openai.com";private Chat chat = new Chat();public static class Chat {private boolean enabled = true;private OpenAiChatOptions options = new OpenAiChatOptions();// getters and setters}// getters and setters
}

配置属性支持:

  • 类型安全:强类型绑定
  • IDE 提示:通过 spring-boot-configuration-processor 生成元数据
  • 验证:支持 JSR-303 验证注解

6.4 自动配置注册

自动配置类通过 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 注册:

org.springframework.ai.model.openai.autoconfigure.OpenAiChatAutoConfiguration
org.springframework.ai.model.openai.autoconfigure.OpenAiEmbeddingAutoConfiguration
org.springframework.ai.model.openai.autoconfigure.OpenAiImageAutoConfiguration

Spring Boot 3.x 使用 AutoConfiguration.imports 文件(替代了之前的 spring.factories)。

6.5 条件装配机制

Spring AI 使用多种条件注解:

// 1. 类路径条件
@ConditionalOnClass(OpenAiChatModel.class)// 2. 配置属性条件
@ConditionalOnProperty(prefix = "spring.ai.openai.chat",name = "enabled",havingValue = "true"
)// 3. Bean 存在条件
@ConditionalOnMissingBean(ChatModel.class)// 4. 资源条件
@ConditionalOnResource(resources = "classpath:openai-config.properties")

这些条件让自动配置变得智能:

  • 按需加载:只加载需要的配置
  • 避免冲突:不会覆盖用户自定义的 Bean
  • 灵活配置:可以通过配置属性控制行为

6.6 重试机制自动配置

重试是 AI 应用的重要能力:

@AutoConfiguration
@ConditionalOnClass(RetryUtils.class)
@EnableConfigurationProperties(SpringAiRetryProperties.class)
public class SpringAiRetryAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic RetryTemplate retryTemplate(SpringAiRetryProperties properties) {return RetryTemplate.builder().maxAttempts(properties.getMaxAttempts()).retryOn(TransientAiException.class).retryOn(ResourceAccessException.class).exponentialBackoff(properties.getBackoff().getInitialInterval(),properties.getBackoff().getMultiplier(),properties.getBackoff().getMaxInterval()).build();}
}

配置示例:

spring:ai:retry:max-attempts: 3backoff:initial-interval: 1smultiplier: 2.0max-interval: 10s

6.7 工具调用自动配置

工具调用自动配置:

@AutoConfiguration
@ConditionalOnClass({ToolCallingManager.class, ChatModel.class})
public class ToolCallingAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic ToolCallingManager toolCallingManager(ObservationRegistry observationRegistry,ToolCallbackResolver toolCallbackResolver) {return new DefaultToolCallingManager(observationRegistry,toolCallbackResolver,new DefaultToolExecutionExceptionProcessor());}@Bean@ConditionalOnMissingBeanpublic ToolCallbackResolver toolCallbackResolver(ApplicationContext context) {return new DelegatingToolCallbackResolver(new SpringBeanToolCallbackResolver(context),new StaticToolCallbackResolver());}
}

7. 配置属性管理

7.1 配置属性层次

Spring AI 的配置属性采用层次结构:

spring:ai:openai:                    # 提供商级别api-key: xxxchat:                     # 功能级别enabled: trueoptions:                # 选项级别model: gpt-4temperature: 0.7

7.2 配置属性验证

支持 JSR-303 验证:

@ConfigurationProperties(prefix = "spring.ai.openai")
@Validated
public class OpenAiChatProperties {@NotBlankprivate String apiKey;@Min(0)@Max(2)private Double temperature;
}

7.3 配置属性提示

通过 additional-spring-configuration-metadata.json 提供 IDE 提示:

{"properties": [{"name": "spring.ai.openai.chat.options.model","type": "java.lang.String","description": "The model to use for chat completions.","defaultValue": "gpt-3.5-turbo"}]
}

8. Bean 创建流程

8.1 Bean 创建顺序

自动配置的 Bean 创建顺序:

  1. 配置属性 Bean:首先创建配置属性 Bean
  2. 依赖 Bean:创建依赖的 Bean(如 RetryTemplate)
  3. 核心 Bean:创建核心功能 Bean(如 ChatModel)
  4. 增强 Bean:创建增强功能 Bean(如 Advisor)

8.2 Bean 覆盖机制

用户可以通过 @Primary@ConditionalOnMissingBean 覆盖自动配置的 Bean:

@Configuration
public class CustomConfig {@Bean@Primary  // 优先使用public ChatModel customChatModel() {return new CustomChatModel();}
}

9. 外部依赖

9.1 Spring Boot

  • spring-boot-starter:核心 Starter
  • spring-boot-autoconfigure:自动配置支持
  • spring-boot-configuration-processor:配置属性处理

9.2 Spring Framework

  • spring-context:IoC 容器
  • spring-beans:Bean 管理
  • spring-core:核心功能

10. 工程总结

Spring AI 的 Spring Boot 集成设计有几个亮点:

零配置理念。通过 Starter 和 Auto Configuration,用户只需要添加依赖和配置属性,就能使用 AI 能力,无需编写任何配置代码。想用 OpenAI?加个依赖,配个 API Key,就能用了。

条件装配。使用 @ConditionalOn* 注解,让自动配置变得智能,只加载需要的配置,避免不必要的 Bean 创建

配置属性驱动。所有配置都通过 application.ymlapplication.properties,支持类型安全和 IDE 提示。写配置时有自动补全,写错了编译期就能发现。

可扩展性。用户可以轻松覆盖自动配置的 Bean,实现自定义行为。想自定义 ChatModel?加个 @Primary 注解就行。

模块化设计。每个功能都有独立的 Starter 和 Auto Configuration,用户可以选择性地添加需要的功能。想用向量存储?加个 spring-ai-starter-vector-store-pgvector 就行。

总的来说,Spring AI 的 Spring Boot 集成既简单又强大。简单的使用方式降低了学习成本,强大的自动配置机制让系统可以适应各种场景。这种设计让开发者可以快速构建 AI 应用,同时也能根据需求进行深度定制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/980082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WSL 迁移发行版位置

1、查看发行版 PS C:\Users\18071> wsl --list --verboseNAME STATE VERSION * Ubuntu-20.04 Stopped 22、必须先关闭 WSL wsl --shutdown3、导出发行版 wsl --export Ubuntu-20.0…

7款AI论文写作辅助必备工具:毕业论文高效完成全攻略

校园论坛上毕业生写论文的求助帖引发共鸣,2025 年 AI 成写论文得力助手。作者试用 7 款 AI 论文写作辅助工具并测评,包括图灵论文 AI 写作助手、巨鲸写作等。各工具功能多样,如一键生成初稿、解析导师意见、处理问卷…

MySQL语法之用alter增加删除列

用MySQL alter table增加、删除或修改字段,设置新字段位置。摘要:用MySQL alter table增加、删除或修改字段,设置新字段位置。 综述在 MySQL 中,ALTER TABLE 语法糖常常被用于修改已经创建表的结构。工作中,经常遇…

【JUnit实战3_17】第九章:容器内测试(下)——Arquillian 框架的用法简介 - 实践

【JUnit实战3_17】第九章:容器内测试(下)——Arquillian 框架的用法简介 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fon…

详细介绍:Web安全深度实战:从漏洞挖掘到安全防护

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

敬请人(自己)采/警示后人(自己)合辑

一定取模 数组越界不一定导致re,也可能导致错误赋值 dp 转移方向 能用 bitset 尽量不要用 map

利用多项式模型对二维平面上的数据点进行拟合时,需要预先指定多项式的次数吗?

需要预先指定多项式的次数,且这个次数属于「超参数」,需通过验证集优化选择,核心逻辑和实操步骤如下: 一、关键结论 多项式回归中,“一次(线性)、二次、三次”本质是模型的结构超参数(决定模型复杂度),不能由…

使用RecyclerView.ItemDecoration自定义RecyclerView圆角滚动条

使用RecyclerView.ItemDecoration自定义RecyclerView圆角滚动条 其实RecyclerView自带滚动条,设置android:scrollbars="vertical"即可。想让其长期显示,设置android:fadeScrollbars="false"即可…

SkeyeVSS视频融合系统——安全帽AI检测算法 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

技术分析:越南部分银行 App 不当使用 iOS 私有 API

技术分析:越南部分银行 App 不当使用 iOS 私有 API 原文标题: Technical Analysis - Improper Use of Private iOS APIs in some Vietnamese Banking Apps 来源: Verichains Blog https://blog.verichains.io/p/techn…

U636457 刺客

设 \(f_i\) 表示第一次到达 \(i\) 的所用时间,初始 \(f_1 = 0\)。 首先考虑运动的形态会是什么样子,应该是第一次走到 \(i\),然后不断的跳 \(p_i\),直到再一次走到 \(i\),再向 \(i + 1\) 走。 其实转移是很好转移…

Windows Docker 安装 RabbitMQ(包含客户端图形界面) - Higurashi

一、安装前准备 确保你的 Windows 上已经:安装 Docker Desktop 已开启 WSL2(Docker 默认要求)验证 Docker 是否正常: docker --version二、拉取带管理界面插件的 RabbitMQ 镜像 RabbitMQ 官方镜像里带管理界面的版…

《R语言医学数据分析实战》学习记录|第三章 数据框的操作

第三章 数据框的操作 内容记录 TLDR记录数据框结构数据的基本属性(清单列表:head(),tail(),摘要数据:str(),epiDisplay::des()) 操作数据框数据:选取子集subset(),增删元素 dplyr包对数据框数据的操作:筛选,排序…

软件工程学习日志2025.11.28

📋 实验内容概述 本次实验分为两大部分:Linux基础命令操作和Hadoop环境实践,旨在为后续大数据实验打下坚实的基础。 🎯 具体完成内容 一、Linux操作部分(2.5小时)目录操作命令成功掌握的cd命令操作 cd /usr/lo…

2025年11月晶振厂家推荐:权威榜与选择指南

在电子元器件领域,晶振作为时钟频率的核心部件,其性能直接影响整个系统的稳定性和可靠性。随着5G通信、物联网、汽车电子等行业的快速发展,市场对高精度、高稳定性晶振的需求持续增长。许多工程师、采购人员或企业决…

2025年11月晶振厂家推荐榜单:主流厂商综合对比与选择指南

在电子设备日益精密的今天,晶振作为时钟频率的核心元件,其稳定性与可靠性直接关系到整个系统的性能。无论是通信基站、工业控制、汽车电子还是消费类产品,工程师在选择晶振厂家时往往面临诸多考量,例如厂家的技术实…

漏洞赏金猎人的深度侦察方法论 | 第一部分

本文详细介绍了漏洞赏金猎人的侦察方法论,包括范围审查、子域名枚举等关键步骤,帮助安全研究人员系统性地发现潜在漏洞和安全风险。漏洞赏金猎人的深度侦察方法论 | 第一部分 仅供会员阅读的故事 作者:Abhijeet Kum…

2025年11月晶振厂家推荐:权威榜单与选择指南

在电子元器件领域,晶振作为时钟频率的核心部件,其性能直接影响整机设备的稳定性和可靠性。随着5G通信、物联网、汽车电子等产业的快速发展,市场对高精度、高稳定性晶振的需求持续增长。根据行业报告显示,全球晶振市…

高效且常用的国产AI工具

一是“工具线”:本书详解了16个高效且常用的国产AI工具,包括文心一言、Kimi、WPSAI、百度文库、橙篇、豆包、通义、智谱清言、秘塔、文心一格、天工AI、讯飞星火、360智绘、剪映、即梦AI及可灵AI,并且随书再附赠10款…

2025年11月晶振厂家推荐榜单:主流厂商综合对比选择指南

在电子元器件采购与供应链管理过程中,晶振作为时钟频率核心元件,其稳定性与可靠性直接影响整机性能。随着5G通信、物联网、汽车电子等新兴领域快速发展,市场对高精度、低功耗、小型化晶振需求持续增长。根据工信部2…