Spring Boot 自动配置原理:从入门到精通
Spring Boot 的自动配置是其核心特性之一,它极大地简化了 Spring 应用的开发,让开发者可以专注于业务逻辑,而无需编写大量的配置代码。 本文将深入探讨 Spring Boot 自动配置的原理,帮助你理解其工作机制,并能灵活运用到实际项目中。
## 1. 什么是 Spring Boot 自动配置?
Spring Boot 自动配置是指 Spring Boot 能够根据项目中的依赖和配置,自动配置 Spring 应用所需的各种 Bean,例如数据源、Web 服务器、消息队列等。 简单来说,就是 Spring Boot 能够“猜测”你需要的配置,并自动帮你完成。
**优点:**
* **简化配置:** 减少了手动配置 Bean 的工作量。
* **提高开发效率:** 开发者可以专注于业务逻辑,无需花费大量时间在配置上。
* **约定优于配置:** Spring Boot 遵循“约定优于配置”的原则,提供了一套默认的配置,开发者可以根据需要进行自定义。
## 2. 自动配置的入口:`@EnableAutoConfiguration`
`@EnableAutoConfiguration` 注解是开启 Spring Boot 自动配置的入口。 通常,它会被添加到主应用程序类上,例如:
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}}
@SpringBootApplication
注解实际上是一个组合注解,包含了 @EnableAutoConfiguration
、@ComponentScan
和 @Configuration
。
3. 自动配置的核心:AutoConfiguration.imports
@EnableAutoConfiguration
注解会导入 AutoConfigurationImportSelector
类,该类负责扫描 classpath 下所有 jar 包中的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件 1。
AutoConfiguration.imports
文件中包含了所有需要自动配置的类的全限定名,例如:
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
Spring Boot 会读取这些类,并根据一定的条件来决定是否加载它们。
4. 条件装配:@Conditional
注解
Spring Boot 使用 @Conditional
注解来实现条件装配。 @Conditional
注解可以根据不同的条件来决定是否加载一个 Bean。 常用的 @Conditional
派生注解包括:
@ConditionalOnClass
:当 classpath 下存在指定的类时,才会加载 Bean。@ConditionalOnMissingBean
:当 Spring 容器中不存在指定的 Bean 时,才会加载 Bean。@ConditionalOnProperty
:当指定的配置属性存在时,才会加载 Bean。@ConditionalOnWebApplication
:当应用是 Web 应用时,才会加载 Bean。
示例:DataSourceAutoConfiguration
DataSourceAutoConfiguration
类用于自动配置数据源。 它使用了 @ConditionalOnClass
和 @ConditionalOnMissingBean
注解:
@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {@Bean@ConfigurationProperties("spring.datasource")public DataSource dataSource() {return DataSourceBuilder.create().build();}
}
@ConditionalOnClass(DataSource.class)
:只有当 classpath 下存在javax.sql.DataSource
类时,才会加载DataSourceAutoConfiguration
类。 这意味着只有当项目中引入了数据库驱动时,才会自动配置数据源。@ConditionalOnMissingBean(DataSource.class)
:只有当 Spring 容器中不存在DataSource
类型的 Bean 时,才会创建DataSource
Bean。 这意味着如果开发者手动配置了数据源,Spring Boot 就不会自动配置数据源。
5. 自动配置的流程
下面是 Spring Boot 自动配置的流程图:
流程说明:
- 应用启动时,
@EnableAutoConfiguration
注解生效。 @EnableAutoConfiguration
注解导入AutoConfigurationImportSelector
类。AutoConfigurationImportSelector
类扫描 classpath 下所有 jar 包中的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件。AutoConfigurationImportSelector
类加载AutoConfiguration.imports
文件中指定的自动配置类。- Spring Boot 根据自动配置类上的
@Conditional
注解判断是否需要注册 Bean。 - 如果条件成立,则注册 Bean;否则,跳过该自动配置类。
- 应用启动完成。
6. 自定义自动配置
虽然 Spring Boot 提供了大量的自动配置类,但在某些情况下,我们可能需要自定义自动配置。 自定义自动配置的步骤如下:
- 创建一个配置类,并使用
@Configuration
注解进行标注。 - 使用
@Conditional
注解来指定自动配置的条件。 - 在
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件中添加自定义配置类的全限定名。
示例:自定义 HelloService
自动配置
- 创建
HelloService
接口和实现类:public interface HelloService {String sayHello(String name); }public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello(String name) {return "Hello, " + name + "!";} }
- 创建
HelloServiceAutoConfiguration
类:import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;@Configuration public class HelloServiceAutoConfiguration {@Bean@ConditionalOnMissingBean(HelloService.class)public HelloService helloService() {return new HelloServiceImpl();} }
- 在
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件中添加HelloServiceAutoConfiguration
类的全限定名:com.example.autoconfigure.HelloServiceAutoConfiguration
现在,当 Spring Boot 应用启动时,会自动配置
HelloService
Bean,除非开发者手动配置了HelloService
Bean。
7. 总结
Spring Boot 自动配置是其核心特性之一,它极大地简化了 Spring 应用的开发。 理解 Spring Boot 自动配置的原理,可以帮助我们更好地使用 Spring Boot,并能灵活运用到实际项目中。
希望本文能够帮助你理解 Spring Boot 自动配置的原理。 如果你有任何问题,欢迎留言讨论。
相关文章:

Spring Boot 自动配置原理:从入门到精通
Spring Boot 的自动配置是其核心特性之一,它极大地简化了 Spring 应用的开发,让开发者可以专注于业务逻辑,而无需编写大量的配置代码。 本文将深入探讨 Spring Boot 自动配置的原理,帮助你理解其工作机制,并能灵活运用…...
实践深度学习:构建一个简单的图像分类器
引言 深度学习在图像识别领域取得了巨大的成功。本文将指导你如何使用深度学习框架来构建一个简单的图像分类器,我们将以Python和TensorFlow为例,展示从数据准备到模型训练的完整流程。 环境准备 在开始之前,请确保你的环境中安装了以下工…...

腾讯 ovCompose 开源,Kuikly 鸿蒙和 Compose DSL 开源,腾讯的“双”鸿蒙方案发布
近日,腾讯的 ovCompose 和 Kuikly 都发布了全新开源更新,其中 Kuikly 在之前我们聊过,本次 Kuikly 主要是正式开源鸿蒙支持部分和 Compose DSL 的相关支持,而 ovCompose 是腾讯视频团队基于 Compose Multiplatform 生态推出的跨平…...

PYTHON调用讯飞C/C++动态库实现离线语音合成并且实时播放
语音合成(Text-to-Speech, TTS)技术在现代应用中扮演着越来越重要的角色,从智能客服到有声读物,从导航系统到辅助工具,TTS技术无处不在。本文将详细介绍如何使用Python结合科大讯飞的离线SDK实现一个本地化的语音合成系统。 技术背景 离线语…...

黑马Java面试笔记之 消息中间件篇(RabbitMQ)
一. 消息丢失问题 RabbitMQ如何保证消息不丢失? 使用场景有: 异步发送(验证码、短信、邮件... )MYSQL和Redis,ES之间的数据同步分布式事务削峰填谷...... 消息丢失原因会有三种情况,分别分析一下 1.1 生…...
Vue中安装插件的方式
一. 认识Vue插件 1.1. 通常向Vue全局添加一些功能时,会采用插件的模式,它有两种编写方式: 1.1.1. 对象类型:一个对象,但是必须包含一个install的函数,该函数会在安装插件时执行 // 方式一:传入…...
如何提高工作效率
最近,跟一个同事同时测同一业务,在对比自己与同事的产出过程中,发现,别人工作效率极高,产出也比较大。最重要的是,别人每天晚上走得早,自己就算加班到九点十点,似乎产出都没别人高。…...

Redisson学习专栏(五):源码阅读及Redisson的Netty通信层设计
文章目录 前言一、分布式锁核心实现:RedissonLock源码深度解析1.1 加锁机制:原子性与重入性实现1.2 看门狗机制:锁自动续期设计1.3 解锁机制:安全释放与通知1.4 锁竞争处理:等待队列与公平性1.5 容错机制:异…...
Spring AI 项目实战(一):Spring AI 核心模块入门
系列文章 序号文章名称1Spring AI 项目实战(一):Spring AI 核心模块入门一、引言:Java 生态下 AI 应用开发的新机遇 在数字化转型浪潮席卷全球的当下,人工智能(AI)技术早已突破实验室的边界,深度融入企业级应用开发核心领域。对于Java开发者而言,如何将成熟稳定的Spr…...
字节跳动开源图标库:2000+图标一键换肤的魔法
一个SVG文件生成四种主题的神奇技术,正在颠覆前端开发者的图标工作流。 深夜两点,设计师小王对着屏幕抓狂——产品经理临时要求将整套线性图标改为双色风格,这意味着他需要重新导出上百个SVG文件。 而隔壁工位的前端小张同样崩溃:…...

结合 AI 生成 mermaid、plantuml 等图表
AI 画图 AI 画图并不是真的让 AI 画一个图片,而是让 AI 根据你的需求,生成对应的需求文本,再根据 “文本画图” 来生成图片。 Mermaid mermaid 支持流程图、时序图、架构图等等多种图片绘制。当然最终生成的效果和样式会根据不同的“文本代…...
行列式详解:从定义到应用
行列式详解:从定义到应用 引言 行列式是线性代数中的核心概念之一,它不仅是矩阵理论的重要组成部分,更是解决线性方程组、计算向量空间体积、判断矩阵可逆性等问题的关键工具。本文将从行列式的基本定义出发,系统地介绍其性质、…...

R语言使用随机过采样(Random Oversampling)平衡数据集
随机过采样(Random Oversampling)是一种用于平衡数据集的技术,常用于机器学习中处理类别不平衡问题。当某个类别的样本数量远少于其他类别时(例如二分类中的正负样本比例悬殊),模型可能会偏向多数类&#x…...
HertzBeat的安装和使用教程
以下是HertzBeat的安装和使用教程: 安装 • Docker安装:执行命令docker run -d -p 1157:1157 -p 1158:1158 --name hertzbeat apache/hertzbeat。启动后,访问http://localhost:1157,默认账号密码是admin/hertzbeat。 • 包安装…...

【Kotlin】高阶函数Lambda内联函数
【Kotlin】简介&变量&类&接口 【Kotlin】数字&字符串&数组&集合 【Kotlin】高阶函数&Lambda&内联函数 【Kotlin】表达式&关键字 文章目录 函数还是属性高阶函数抽象和高阶函数实例: 函数作为参数的需求方法引用表达式更多使用场…...

从0开始学vue:vue3和vue2的关系
一、版本演进关系1. 继承关系2. 版本生命周期 二、核心差异对比三、关键演进方向1. Composition API2. 性能优化 四、迁移策略1. 兼容构建模式2. 关键破坏性变更 五、生态演进1. 官方库升级2. 构建工具链 六、选型建议1. 新项目2. 现有项目 七、未来展望 一、版本演进关系 1. …...

MySQL关系型数据库学习
学习参考链接:https://www.runoob.com/mysql/mysql-tutorial.html Windows 安装MYSQL服务端的步骤:https://www.runoob.com/w3cnote/windows10-mysql-installer.html 1. 概念学习 MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不…...

嵌入式硬件篇---龙芯2k1000串口
针对串口错误 “device reports readiness to read but returned no data (Device disconnected or multiple access on port?)” 的排查和解决方法 硬件方面 检查连接 确认串口设备(如串口线、连接的模块等)与龙芯设备之间的物理连接是否牢固…...
4-C#的不同窗口传值
C#的不同窗口传值 1.通过构造函数传值 this.Hide(); Form1 form01 new Form1(textBox2.Text); //Application.Run(form01); form01.Show();public Form1(string aaa) {InitializeComponent();label12.Text aaa; }2.全局类传值 namespace WindowsFormsApp1 {public class G…...

谷歌地图苹果版v6.138.2 - 前端工具导航
谷歌地图(Google maps)苹果版是是由谷歌官方推出的一款手机地图应用。软件功能强大,支持本地搜索查找世界各地的地址、地点和商家;支持在街景视图中查看世界各地的360度全景图;支持查找乘坐火车、公交车和地铁的路线,或者查找步行…...

NSSCTF [LitCTF 2025]test_your_nc
[复现]绕过学的还是太差了,多积累吧 题目 题目: 给了一个python文件 #!/bin/python3 import osprint("input your command")blacklist [cat,ls, ,cd,echo,<,${IFS},sh,\\]while True:command input()for i in blacklist:if i in com…...
第十九章 正则表达式
第十九章 正则表达式 文本型数据在所有的类UNIX系统(如 Linux)中会扮演着重要角色,在完全领会这些工具的全部特征之前,要先了解一下工具最为复杂的用法和相关技术:正则表达式。 什么是正则表达式 简单地说,正则表达式是一种用于…...
browser-use Agent 日志链路分析
browser-use Agent 日志链路分析 本节详细梳理 browser-use Agent 的日志输出,从 Agent 初始化到每一步的行为日志,帮助理解其行为轨迹。 1. Agent 初始化阶段 日志点: logger.info(🧠 Starting a browser-use agent ...) 记录 …...

Qwen3高效微调
高效微调 场景、模型、数据、算力 高效微调的应用场景 对话风格微调:高效微调可以用于根据特定需求调整模型的对话风格。例如,针对客服系统、虚拟助理等场景,模型可以通过微调来适应不同的 语气、礼貌程度 或 回答方式,从而在与…...

Gitee Wiki:重塑关键领域软件研发的知识管理范式
在数字化转型浪潮席卷全球的当下,关键领域软件研发正面临前所未有的知识管理挑战。传统文档管理模式的局限性日益凸显,知识传承的断层问题愈发严重,团队协作效率的瓶颈亟待突破。Gitee Wiki作为新一代知识管理平台,正在通过技术创…...

redis的哨兵模式和Redis cluster
目录 一. redis的主从复制 二. 哨兵模式 2.1 定义 2.2 作用 2.3 配置实例 三. Redis cluster 3.1 定义 3.2 作用 3.3 配置实例 1. 新建集群文件目录 2. 准备可执行文件到每个文件夹 3. 开启群集功能 4. 启动redis节点 5. 查看是否启动成功 6. 启动集群 7. 测试…...
MySQL计算精度计算加减乘除取模方式和方法总计
以下是 MySQL 中常用计算方式和方法 的总结,涵盖不同场景下的使用方式及示例说明: 1. 基本算术运算 适用场景: 对表中的字段或数值进行基础数学运算(加、减、乘、除、取模)。适用于单条记录的字段计算(如单价+税金、折扣后的价格等)。运算符: 运算符描述示例+加法SELE…...

农业机器人的开发
农业机器人的开发 喷农药机器人 番茄采摘机器人 葡萄采摘机器人 黄瓜采摘机器人 西瓜采摘机器人 蘑菇采摘机器人 草莓采摘机器人 草莓采摘机器人综述 视觉系统 CCD摄像机,距离传感器,PC计算机 其中CCD摄像机的作用是进行彩色图像的采集和进行果…...

Swift 解锁 LeetCode 热门难题:不改数组也能找出重复数字?
文章目录 摘要描述题解答案题解代码分析解读: 示例测试及结果时间复杂度空间复杂度总结实际场景类比可运行 Demo(Swift Playground)未来展望 摘要 在数组中找出唯一的重复数字,听起来像一道简单的题目,但如果你不能修…...
2025年微信小程序开发:趋势、最佳实践与AI整合
引言 微信小程序自2017年推出以来,已成为中国互联网生态中不可或缺的一部分。根据最新数据,截至2024年,微信小程序的日活跃用户超过4.5亿,总数超过430万个,95%的中国企业拥有自己的小程序(WeChat Mini Pro…...