当前位置: 首页 > 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.jsqmd.com/news/919692/

相关文章:

  • Django+Vue教育题包综合处理系统源码+论文
  • 别再死记硬背公式了!用Python模拟一个天气预测的马尔可夫链模型(附完整代码)
  • 智慧车站车辆-基于YOLOv8与dlib的驾驶员疲劳检测系统 基于计算机视觉和深度学习技术的智能监测系统,能够实时检测驾驶员的疲劳状态,通过分析眼睛、嘴部等面部特征,及时发出疲劳预警,有效预防疲劳驾驶
  • 开源阅读鸿蒙版:你的数字阅读管家,打造无广告、全定制的阅读自由
  • Claude Code 桌面端 vs CLI 全面安装指南与对比:2026 最新版,选哪个?
  • 2026年5月更新:温州批发甲醇批发厂家实力盘点,瑞安市汇源贸易有限公司值得信赖 - 2026年企业资讯
  • 当kNN遇上隐私计算:用Python复现2009年那篇经典Secure kNN论文的核心算法
  • 如何快速掌握QKeyMapper:Windows设备互通完全指南
  • 斗提机品牌哪家好?锐禹环保设备值得推荐 - myqiye
  • 【深度解析】Hermes Agent Velocity Release:长期记忆、自进化技能与多智能体任务编排实践
  • NX二次开发避坑指南:为什么你的多线程调用UF函数会崩溃?附安全调用libpart.dll的实战解析
  • 从Palantir到开源方案:手把手教你用Python+Neo4j搭建简易时空知识图谱(避坑指南)
  • 别再死磕LSTM了!用Python手搓一个回声状态网络(ESN),轻松搞定时间序列预测
  • 基于 YOLOv8 的快递纸箱缺陷检测系统(完整项目|可直接运行)快递纸箱缺陷检测数据集训练及应用
  • 2026年四川工业阀门厂家TOP5采购参考推荐 - 优质品牌商家
  • 水上乐园涂料铺什么好?耐磨、附着力和长期浸水稳定性是关键
  • Prometheus监控服务部署与实战指南
  • 【深度解析】Claude Opus 编码模型的工程化使用:长上下文、Agent 工作流与代码审查实战
  • 2026年北京赤火时代水淬炉改造哪家好? - myqiye
  • 运维工程师必备:用PowerShell脚本批量采集局域网内多台Windows电脑的硬件信息
  • 破解网盘限速:智能下载助手让文件传输重回自由时代
  • 如何彻底验证CPU稳定性:CoreCycler硬件测试完整指南
  • 《咫尺华胥》
  • 2026工业离心泵选型推荐:消防泵厂家/深井泵厂家/特殊不锈钢管厂家/球阀厂家/靠谱厂家核心判定维度 - 优质品牌商家
  • 保姆级避坑指南:在Ubuntu 20.04 ROS Noetic上搞定A-LOAM跑KITTI数据集(含源码修改与Ceres 1.14安装)
  • 麦克维尔中央空调新兴代理商靠谱吗?口碑怎么样? - mypinpai
  • 68.专治系统崩溃黑砖!EDL紧急救砖+DFU固件恢复完整可复现方案
  • C++ io_uring的使用小结
  • PlantUML——定时图
  • 音乐格式解密终极指南:5分钟快速解锁加密音频文件的完整免费方案