SpringBoot核心原理:自动配置、starter、SPI机制
SpringBoot核心原理自动配置、starter、SPI机制SpringBoot就像一个贴心管家你想要什么它提前帮你摆好不用你操心配置。但管家是怎么知道你想要什么的这篇就拆开它的脑袋看看。一、SpringBoot vs 传统Spring传统Spring项目有多折磨人一堆XML配置文件配个数据源能写半屏XML漏个分号项目就启动不了。SpringBoot的三个核心改变约定大于配置 sensible defaults你不配就用默认值内嵌Tomcat不需要单独部署war包java -jar直接跑零XML配置用注解和Java配置类替代XML一句话总结SpringBoot不是新框架它是Spring的全家桶套餐自动安装服务。二、起步依赖(starter)原理2.1 starter是什么starter是SpringBoot提供的一组依赖打包方案。比如你引入spring-boot-starter-webdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency一个依赖进来背后实际上带了一大堆东西包含的依赖作用spring-webSpring MVC核心spring-webmvcMVC框架tomcat-embed-core内嵌Tomcatjackson-databindJSON序列化spring-boot-starter-validation参数校验2.2 依赖传递机制Maven的依赖传递transitive dependency是starter能工作的底层机制。A依赖BB依赖CA自动获得C。所以你只写一行dependencyMaven帮你把整棵依赖树拉进来。这就是为什么SpringBoot项目的pom.xml看起来特别干净——复杂度被starter封装掉了。三、自动配置核心原理这是SpringBoot的灵魂所在。3.1 SpringBootApplication注解拆解启动类上的SpringBootApplication是个复合注解拆开看SpringBootConfiguration// 本质是Configuration标记配置类EnableAutoConfiguration// 自动配置的开关ComponentScan// 组件扫描扫描当前包及子包publicclassMyApplication{...}核心是EnableAutoConfiguration。3.2 从注解到AutoConfiguration.importsEnableAutoConfiguration通过Import(AutoConfigurationImportSelector.class)引入了一个选择器这个选择器做的事情是读取META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件把里面列出的所有自动配置类加载进来SpringBoot 3.x之前用的是META-INF/spring.factories3.x之后改成了AutoConfiguration.imports文件目的更清晰——把自动配置类和普通SPI配置分开。文件内容长这样org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration org.springframework.boot.autoconfigure.redis.RedisAutoConfiguration ... (几百个)3.3 条件装配注解光加载配置类还不够如果项目里没引Redis依赖RedisAutoConfiguration加载了也白搭。所以每个配置类上都有一堆条件注解注解条件ConditionalOnClassclasspath存在指定类时才生效ConditionalOnBean容器中存在指定Bean时才生效ConditionalOnProperty配置文件中存在指定属性时才生效ConditionalOnMissingBean容器中不存在指定Bean时才生效让你能覆盖默认配置ConditionalOnWebApplication是Web应用时才生效举例AutoConfigurationConditionalOnClass(RedisOperations.class)EnableConfigurationProperties(RedisProperties.class)publicclassRedisAutoConfiguration{// 只有classpath有Redis相关类这个配置类才会生效}3.4 自动配置执行流程启动main方法 → 创建SpringApplication → refreshContext() 刷新容器 → invokeBeanFactoryPostProcessors() → AutoConfigurationImportSelector执行 → 读取AutoConfiguration.imports → 加载所有自动配置类 → 逐个进行Conditional条件判断 → 条件满足 → 注册Bean到容器 → 条件不满足 → 跳过四、SPI机制简介4.1 什么是SPISPIService Provider Interface是一种服务发现机制。核心思想定义接口在API包中实现在各个SPI包中运行时动态发现并加载实现。4.2 Java SPI vs SpringBoot SPI对比项Java SPISpringBoot SPI配置文件位置META-INF/services/META-INF/spring/配置文件名接口全限定名AutoConfiguration.imports加载机制ServiceLoaderAutoConfigurationImportSelector是否支持条件过滤否全部加载是通过ConditionalJava SPI的缺点是一刀切全加载SpringBoot在此基础上加了条件判断只加载需要的这就是进步。五、实战自定义一个starter光说不练假把式我们来手写一个简单的starter。5.1 项目结构hello-spring-boot-starter/ # starter模块空jar只做依赖声明 └── pom.xml hello-spring-boot-autoconfigure/ # 自动配置模块 ├── src/main/java/com/example/hello/ │ ├── HelloProperties.java # 配置属性绑定类 │ ├── HelloService.java # 核心服务类 │ └── HelloAutoConfiguration.java # 自动配置类 └── src/main/resources/ └── META-INF/spring/ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports5.2 核心代码配置属性类ConfigurationProperties(prefixhello)publicclassHelloProperties{privateStringnameWorld;privateinttimes1;// getter/setter省略}服务类publicclassHelloService{privateHelloPropertiesproperties;publicStringsayHello(){StringBuildersbnewStringBuilder();for(inti0;iproperties.getTimes();i){sb.append(Hello, ).append(properties.getName()).append(!\n);}returnsb.toString();}// setter省略}自动配置类AutoConfigurationConditionalOnProperty(prefixhello,nameenabled,havingValuetrue,matchIfMissingtrue)EnableConfigurationProperties(HelloProperties.class)publicclassHelloAutoConfiguration{BeanConditionalOnMissingBeanpublicHelloServicehelloService(HelloPropertiesproperties){HelloServiceservicenewHelloService();service.setProperties(properties);returnservice;}}AutoConfiguration.imports文件内容com.example.hello.HelloAutoConfiguration5.3 使用方式别的项目引入这个starter后直接注入就能用RestControllerpublicclassTestController{AutowiredprivateHelloServicehelloService;GetMapping(/hello)publicStringhello(){returnhelloService.sayHello();}}在application.yml中配置参数hello:name:黑漂技术佬times:3启动项目访问/hello就能看到效果了。这就是SpringBoot自动配置的完整闭环starter声明依赖 → AutoConfiguration.imports注册配置类 → Conditional条件判断 → EnableConfigurationProperties绑定参数 → 注册Bean → 业务代码直接注入使用。

相关新闻

苹果手机与 NFC 贴纸

苹果手机与 NFC 贴纸

首发于:https://swhl.github.io/latest/blog/iphone-with-nfc-tag/引言 无意中发现了 NFC 贴纸这个东西,感觉世界又变得有趣起来。自己平时在用手机 NFC 坐地铁和公交,用手环 NFC 开门,感觉 NFC 也就干这些了,因为终端…

2026/7/30 3:08:50 阅读更多 →
海思SS928 SDK安装指南:从交叉编译到环境配置全解析

海思SS928 SDK安装指南:从交叉编译到环境配置全解析

1. 从零开始:为什么SS928的SDK安装是个“技术活”?如果你是从STM32、ESP32这类MCU平台转过来的,或者习惯了树莓派那种“烧录镜像即用”的便捷,第一次接触海思这类安防/视频处理SoC的SDK,可能会有点懵。这感觉就像你之前…

2026/7/30 3:08:50 阅读更多 →
Redisson实战:从分布式锁到高级数据结构,Java操作Redis的工业级方案

Redisson实战:从分布式锁到高级数据结构,Java操作Redis的工业级方案

1. 项目概述:为什么我们需要Redisson?如果你在用Java操作Redis,还在用Jedis或者Lettuce手动拼接命令、处理连接池、操心分布式锁的实现细节,那真的有点“原始社会”的感觉了。我经历过那个阶段,每次写一个setnx加expir…

2026/7/30 3:08:50 阅读更多 →

最新新闻

如何快速上手FastQC:测序数据质量控制的终极指南

如何快速上手FastQC:测序数据质量控制的终极指南

如何快速上手FastQC:测序数据质量控制的终极指南 【免费下载链接】FastQC A quality control analysis tool for high throughput sequencing data 项目地址: https://gitcode.com/gh_mirrors/fa/FastQC 你是否曾因测序数据质量问题而浪费宝贵时间&#xff1…

2026/7/30 3:15:15 阅读更多 →
3分钟学会MatAnyone:免费AI视频抠像神器,无需绿幕也能专业换背景

3分钟学会MatAnyone:免费AI视频抠像神器,无需绿幕也能专业换背景

3分钟学会MatAnyone:免费AI视频抠像神器,无需绿幕也能专业换背景 【免费下载链接】MatAnyone [CVPR 2025] MatAnyone: Stable Video Matting with Consistent Memory Propagation 项目地址: https://gitcode.com/gh_mirrors/ma/MatAnyone 还在为视…

2026/7/30 3:15:15 阅读更多 →
agent学习Day15——SQLAlchemy 查询过滤、分页与历史列表接口

agent学习Day15——SQLAlchemy 查询过滤、分页与历史列表接口

一、为什么需要查询过滤与分页 之前的 Repository 只有 get_by_id 和 list_all——能查一条、能查全部。但真实业务从来不是"给我所有记录": 用户只想看"状态为 success 的记录"搜索框输入"Python",要匹配 JD 原文里含这个…

2026/7/30 3:15:15 阅读更多 →
一站式解决各类需求痛点 高效便捷适配多场景需求的综合服务方案

一站式解决各类需求痛点 高效便捷适配多场景需求的综合服务方案

AI Agent时代的科研革命 这三个工具让你的效率提升十倍 传统科研模式正在被AI彻底颠覆。过去需要几周甚至几个月完成的文献调研和综述写作,现在几天就能搞定。过去需要反复调试才能复现的实验,现在一键就能完成。这三个基于最新AI技术的科研工具&#x…

2026/7/30 3:15:15 阅读更多 →
WarcraftHelper:5分钟搞定魔兽争霸3的现代电脑兼容性问题

WarcraftHelper:5分钟搞定魔兽争霸3的现代电脑兼容性问题

WarcraftHelper:5分钟搞定魔兽争霸3的现代电脑兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典魔兽争霸3在现代电脑上…

2026/7/30 3:15:15 阅读更多 →
架构师的技术雷达——二〇二六下半年的必学技术与可学技术

架构师的技术雷达——二〇二六下半年的必学技术与可学技术

架构师的技术雷达——二〇二六下半年的必学技术与可学技术 一、背景与动机 技术雷达的概念源自 ThoughtWorks,核心思想是将技术按照"采用、试验、评估、暂缓"四个环进行分类,帮助团队做出理性的技术决策。2026 下半年,Java 生态和…

2026/7/30 3:14:15 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻