当前位置: 首页 > news >正文

Spring AI 源码解析(一):自动配置与核心启动流程

Spring AI 源码解析(一):自动配置与核心启动流程

经过前面四篇文章的学习,我们已经能够熟练使用 Spring AI 进行开发。但从今天开始,我们将深入源码层面,探究 Spring AI 背后的实现原理。本文作为源码解析系列的第一篇,将重点分析 Spring AI 的自动配置机制和核心启动流程。

概述:从 Starter 到 Bean 的完整链路

当我们在项目中引入spring-ai-openai-spring-boot-starter时,Spring Boot 会在启动时自动完成以下工作:

  1. 加载自动配置类:通过spring.factoriesAutoConfiguration.imports发现配置类
  2. 条件装配:根据 Classpath 中的依赖和配置属性决定是否创建Bean
  3. 创建核心客户端:初始化OpenAiApi HTTP客户端
  4. 创建 Model Bean:构建OpenAiChatModel、OpenAiEmbeddingModel等核心Bean
  5. 注入高阶 API:构建ChatClient.Builder供开发者使用

源码入口:自动配置类

OpenAiAutoConfiguration

所有的自动配置都始于OpenAiAutoConfiguration类,位于spring-ai-openai模块:

@AutoConfiguration@ConditionalOnClass(OpenAiApi.class)@EnableConfigurationProperties(OpenAiConnectionProperties.class)publicclassOpenAiAutoConfiguration{@Bean@ConditionalOnMissingBeanpublicOpenAiApiopenAiApi(OpenAiConnectionPropertiesconnectionProperties,OpenAiChatOptionschatOptions){returnnewOpenAiApi(connectionProperties.getBaseUrl(),connectionProperties.getApiKey(),connectionProperties.getApiVersion(),chatOptions);}}

关键点解析:

  • @AutoConfiguration:标记为自动配置类
  • @ConditionalOnClass(OpenAiApi.class):仅当 OpenAiApi 类在 Classpath 中存在时才生效
  • @EnableConfigurationProperties:绑定以spring.ai.openai为前缀的配置属性

ChatModel 的自动装配

@Configuration@ConditionalOnBean(OpenAiApi.class)@ConditionalOnProperty(prefix="spring.ai.openai.chat",name="enabled",havingValue="true",matchIfMissing=true)publicclassOpenAiChatAutoConfiguration{@Bean@ConditionalOnMissingBeanpublicOpenAiChatModelopenAiChatModel(OpenAiApiopenAiApi,OpenAiChatOptionschatOptions,List<FunctionCallback>toolFunctions){returnnewOpenAiChatModel(openAiApi,chatOptions).withToolFunctions(toolFunctions);}@Bean@ConditionalOnMissingBeanpublicChatClient.BuilderchatClientBuilder(List<ChatModel>chatModels){returnChatClient.builder(chatModels.get(0));}}

配置属性绑定

属性类层次

@ConfigurationProperties(prefix="spring.ai.openai")publicclassOpenAiConnectionProperties{privateStringbaseUrl="https://api.openai.com";privateStringapiKey;privateStringapiVersion;privateOpenAiChatOptionschat=newOpenAiChatOptions();privateOpenAiEmbeddingOptionsembedding=newOpenAiEmbeddingOptions();}publicclassOpenAiChatOptionsimplementsChatOptions{privateStringmodel="gpt-4o";privateDoubletemperature;privateIntegermaxTokens;privateDoubletopP;privateList<String>stop;}

核心客户端:OpenAiApi

OpenAiApi 是 OpenAI HTTP 客户端的核心封装,它使用了 Spring 的RestClient

publicclassOpenAiApi{privatefinalRestClientrestClient;privatefinalOpenAiChatOptionschatOptions;publicOpenAiApi(StringbaseUrl,StringapiKey,OpenAiChatOptionschatOptions){this.restClient=RestClient.builder().baseUrl(baseUrl).defaultHeader("Authorization","Bearer "+apiKey).defaultHeader("Content-Type","application/json").build();this.chatOptions=chatOptions;}publicChatCompletionResultchatCompletion(ChatCompletionRequestrequest){returnrestClient.post().uri("/v1/chat/completions").body(request).retrieve().body(ChatCompletionResult.class);}}

启动流程

Spring Boot 启动 | v 加载 AutoConfiguration.imports | +--- OpenAiAutoConfiguration | | | v | 创建 OpenAiApi Bean | +--- OpenAiChatAutoConfiguration | | | +--- 创建 OpenAiChatModel Bean | +--- 创建 ChatClient.Builder Bean | +--- OpenAiEmbeddingAutoConfiguration | | | v | 创建 OpenAiEmbeddingModel Bean | v 应用启动完成,所有 AI Bean 就绪

条件装配的巧妙之处

Spring AI 大量使用了 Spring Boot 的条件注解来实现灵活的装配策略:

注解用途示例场景
@ConditionalOnClass检查 Classpath 中是否存在某个类OpenAiApi.class
@ConditionalOnMissingBean仅当不存在自定义 Bean 时才创建允许用户替换默认实现
@ConditionalOnProperty检查配置属性可开关的模块

关键设计原则:Spring AI 始终优先使用用户自定义的 Bean,只有当用户未提供时才使用默认实现,这符合 Spring 生态的一贯理念。

总结:本文要点

  • Spring AI 的自动配置入口是OpenAiAutoConfiguration
  • 条件装配 通过@ConditionalOnClass、@ConditionalOnMissingBean等注解实现灵活控制
  • OpenAiApi 是对 OpenAI REST API 的 HTTP 客户端封装,使用 Spring 6 的 RestClient
  • 配置属性绑定通过@ConfigurationProperties实现,前缀为spring.ai.openai
  • 自动配置的最终产物是ChatModel、EmbeddingModel等核心 Bean 以及ChatClient.Builder
http://www.rkmt.cn/news/1431015.html

相关文章:

  • 别再死记硬背公式了!用Python模拟一个天气预测的马尔可夫链模型(附完整代码)
  • 当kNN遇上隐私计算:用Python复现2009年那篇经典Secure kNN论文的核心算法
  • 从Palantir到开源方案:手把手教你用Python+Neo4j搭建简易时空知识图谱(避坑指南)
  • 别再死磕LSTM了!用Python手搓一个回声状态网络(ESN),轻松搞定时间序列预测
  • 如何彻底验证CPU稳定性:CoreCycler硬件测试完整指南
  • 《咫尺华胥》
  • 麦克维尔中央空调新兴代理商靠谱吗?口碑怎么样? - mypinpai
  • 2026工业离心泵选型推荐:消防泵厂家/深井泵厂家/特殊不锈钢管厂家/球阀厂家/靠谱厂家核心判定维度 - 优质品牌商家
  • 保姆级避坑指南:在Ubuntu 20.04 ROS Noetic上搞定A-LOAM跑KITTI数据集(含源码修改与Ceres 1.14安装)
  • C++ io_uring的使用小结
  • MapLibre GL JS第29课:添加Canvas源
  • 2026年AI论文网站深度评测:6款工具全能表现得分排名
  • Win7离线环境救星:手把手教你修改4个XML和1个注册表,彻底解决VMware Converter 6.2无法启动服务报错
  • 实验一 常用网络命令的使用
  • Arduino雨水监测系统:从传感器原理到物联网报警实现
  • TrafficMonitor插件完全指南:如何将Windows任务栏打造成全能信息中心
  • 因民事养老金管理失误,英国政府拒绝向Capita授予5.63亿英镑合同
  • [开源] 多部门会签文档进度自动重建系统:面向医院行政与临床协同的OCR+状态机追踪工具
  • AnyFlip下载器:三步实现电子书PDF转换的跨平台解决方案
  • 老Mac焕新记:手把手教你用U盘和Ghost镜像给iMac安装纯净版Win7
  • 2026年5月更新:河北有实力的平台钢格板定制厂家选哪家?专业解析与推荐 - 2026年企业资讯
  • 第 20 篇 搭建 Kubernetes 实验环境:Minikube 与 kubectl
  • 2026年国内GEO服务商实力盘点:从短期流量到长效资产的转型之路 - GEO优化
  • 2026降AI率工具红黑榜:降AI率工具怎么选?一文讲透
  • 郑州茅台酒回收商家排行:郑州闲置酒水回收、郑州高价名酒回收、郑州高端名酒回收、郑州上门收茅台、郑州专业老酒回收选择指南 - 优质品牌商家
  • 2026年5月更新:聚焦安徽市场,甄选高性价比安全生产培训直销服务商 - 2026年企业资讯
  • 如何高效管理浏览器下载:Motrix WebExtension专业解决方案
  • Windows高DPI缩放总让你头疼?从‘模糊’到‘清晰’的完整设置指南(含Win10/11避坑清单)
  • C# 重写
  • 干货合集:2026年实测靠谱的专业降AI率平台