Spring Boot自动装配机制的原理

文章目录

      • 一、自动装配的核心触发点:@SpringBootApplication
      • 二、@EnableAutoConfiguration的作用:导入自动配置类
      • 三、自动配置类的加载:SpringFactoriesLoader
      • 四、自动配置类的条件筛选:@Conditional注解
      • 五、自动配置的完整流程
      • 六、自定义自动配置(扩展)
      • 总结

Spring Boot的自动装配(Auto-configuration) 是其核心特性之一,它通过约定大于配置的思想,自动完成Spring应用的初始化和组件配置,大幅简化了传统Spring应用中繁琐的XML或JavaConfig配置。其核心原理可概括为:通过注解触发自动配置逻辑,扫描并加载预设的配置类,结合条件判断动态注册Bean到Spring容器

一、自动装配的核心触发点:@SpringBootApplication

Spring Boot应用的启动类通常标注@SpringBootApplication注解,这个注解是自动装配的“总开关”,它是一个复合注解,包含三个关键注解:

@SpringBootConfiguration // 等同于@Configuration,标记当前类为配置类
@ComponentScan // 扫描当前包及子包下的@Component等注解,注册Bean
@EnableAutoConfiguration // 核心:开启自动装配机制
public @interface SpringBootApplication { ... }

其中,@EnableAutoConfiguration是触发自动装配的核心注解。

二、@EnableAutoConfiguration的作用:导入自动配置类

@EnableAutoConfiguration的核心功能是导入预设的自动配置类,其底层通过@Import(AutoConfigurationImportSelector.class)实现:

@Import(AutoConfigurationImportSelector.class) // 导入自动配置选择器
public @interface EnableAutoConfiguration { ... }

AutoConfigurationImportSelector是自动装配的“大脑”,它的主要作用是:从类路径中加载并筛选出符合条件的自动配置类,并将这些类导入到Spring容器中。

三、自动配置类的加载:SpringFactoriesLoader

AutoConfigurationImportSelector通过SpringFactoriesLoader工具类,读取类路径下的META-INF/spring.factories(Spring Boot 2.7+ 改为META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports)文件,该文件中定义了所有候选的自动配置类全路径。

例如,spring-boot-autoconfigure包中的该文件会包含:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
...

这些类(如DataSourceAutoConfigurationDispatcherServletAutoConfiguration)就是Spring Boot预定义的自动配置类,分别对应数据源、Web容器等组件的自动配置。

四、自动配置类的条件筛选:@Conditional注解

加载的候选自动配置类并非全部生效,而是通过条件注解(@Conditional系列) 动态判断是否需要生效,避免不必要的Bean注册。常见的条件注解包括:

注解作用示例场景
@ConditionalOnClass当类路径中存在指定类时生效只有存在DispatcherServlet类时,WebMvc自动配置才生效
@ConditionalOnMissingClass当类路径中不存在指定类时生效若未引入Redis依赖,Redis自动配置不生效
@ConditionalOnBean当容器中存在指定Bean时生效若已手动定义DataSource,数据源自动配置不生效
@ConditionalOnMissingBean当容器中不存在指定Bean时生效若未手动定义RestTemplate,自动配置默认的RestTemplate
@ConditionalOnProperty当配置文件中存在指定属性时生效通过spring.datasource.enabled=true控制数据源配置是否生效
@ConditionalOnWebApplication当应用是Web应用时生效WebMvc自动配置仅在Web环境下生效

例如,DataSourceAutoConfiguration(数据源自动配置类)的部分代码:

@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class}) // 存在数据源相关类时生效
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory") // 不存在R2DBC连接工厂时生效
@EnableConfigurationProperties(DataSourceProperties.class) // 绑定配置文件属性
public class DataSourceAutoConfiguration { ... }

只有满足所有条件,该自动配置类才会被Spring容器加载,进而注册数据源相关的Bean(如DataSourceDataSourceProperties等)。

五、自动配置的完整流程

  1. 启动触发:应用启动时,@SpringBootApplication中的@EnableAutoConfiguration生效,触发AutoConfigurationImportSelector
  2. 加载候选配置类AutoConfigurationImportSelector通过SpringFactoriesLoader读取META-INF/spring.factories(或新版的imports文件),获取所有候选自动配置类。
  3. 条件筛选:根据自动配置类上的@Conditional注解,过滤掉不满足条件的配置类。
  4. 注册Bean:剩余的自动配置类被Spring容器解析,其内部定义的Bean(如@Bean注解的方法)被注册到容器中。
  5. 配置绑定:通过@EnableConfigurationProperties将配置文件(application.properties/yaml)中的属性绑定到对应的配置类(如DataSourceProperties绑定spring.datasource.*属性),实现配置动态化。

六、自定义自动配置(扩展)

若需为自定义组件实现自动装配,可按以下步骤:

  1. 创建自动配置类:定义一个标注@Configuration的类,使用@Conditional注解控制生效条件,通过@Bean注册组件。
  2. 绑定配置属性:通过@ConfigurationProperties定义配置类,绑定应用配置文件中的属性。
  3. 注册自动配置类:在项目的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中,添加自定义自动配置类的全路径。

总结

Spring Boot自动装配的核心原理是:通过@EnableAutoConfiguration触发,借助AutoConfigurationImportSelector加载预设的自动配置类,结合@Conditional条件注解动态筛选,最终将符合条件的Bean注册到Spring容器。这一机制实现了“约定大于配置”,大幅简化了Spring应用的初始化流程,同时保留了通过自定义配置覆盖默认行为的灵活性。

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

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

相关文章

(未完结)阶段小总结(一)——大数据与Java

jdk8-21特性核心特征:(8)lambda,stream api,optional,方法引用,函数接口,默认方法,新时间Api,函数式接口,并行流,ComletableFuture。&…

嵌入式Linux驱动开发:设备树与平台设备驱动

嵌入式Linux驱动开发:设备树与平台设备驱动 引言 本笔记旨在详细记录嵌入式Linux驱动开发中设备树(Device Tree)和平台设备驱动(Platform Driver)的核心概念与实现。通过分析提供的代码与设备树文件,我们…

【完整源码+数据集+部署教程】骨折检测系统源码和数据集:改进yolo11-EfficientHead

背景意义 骨折作为一种常见的骨骼损伤,其诊断和治疗对患者的康复至关重要。传统的骨折检测方法主要依赖于医生的经验和影像学检查,如X光、CT等,这不仅耗时,而且容易受到主观因素的影响。随着计算机视觉和深度学习技术的迅猛发展&a…

面试记录7 c++软件开发工程师

开目 一面: 自我介绍你做的xxx应用是用c做的吗,是在window平台吗具体做的事情是什么你说的2D3D的结构是什么样的,怎样去做校验有没有二维到三维或者三维到二维的数据转换两个向量怎么去做校验做的什么优化有调用第三方库吗是用的什么工具&…

计算机网络:服务器处理多客户端(并发服务器)

一、服务器处理多客户端(并发服务器)(一)listen:监听客户端的连接请求,放入请求队列(二)accpet:请求队列中提取已连接的请求,返回连接好的fd(循环accpet即可&…

Ansible自动化运维:原理以及安装教程

目录 Linux Ansible:作用与原理详解 一、Ansible 的核心作用 1. 配置管理(Configuration Management) 2. 应用部署(Application Deployment) 3. 任务编排(Orchestration) 4. 其他扩展作用 二、A…

[机器学习]基于K-means聚类算法的鸢尾花数据及分类

基于Kmeans,对鸢尾花数据集前两个特征进行聚类分析通过迭代优化,将150个样本划分到K个簇中。目标函数:最小化所有样本到其所属簇中心的距离平方和。算法步骤:随机初始化K个簇中心。将每个样本分配到最近的中心。计算均值确定每个簇…

Altium Designer 22使用笔记(10)---PCB铺铜相关操作

目录 01 | 简 述 02 | 环境描述 03 | 铺 铜 04 | 铺铜挖空 05 | 敷铜合并 06 | 敷铜的修改 07 | 总 结 01 | 简 述 在PCB设计阶段,除了布局、布线操作需要频繁进行调整外,铺铜操作的使用也非常频繁;因此本篇文章的主要内容为&#xff…

leetcode 338 比特位计数

一、题目描述二、解题思路我们可以借助位运算的思想来解决这个问题。通过kk&(k-1)来消除k中最右边为1的比特位,每次消除后进行count,当k为0时,表示所有的1消除完毕,此时的count即为所有1的个数。三、代码实现时间复杂度&#…

PHP的md5()函数分析

MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,由Ronald Rivest于1991年设计,属于密码散列算法家族。其核心功能是将任意长度的输入数据(如字符串、文件等)通过不可逆的数学运算转换为固定长度…

【面试场景题】怎么做业务领域划分

文章目录一、核心原则:以业务为中心,而非技术二、具体步骤:从业务理解到边界定义1. 深入理解业务:梳理业务全景2. 识别核心领域与支撑领域3. 划分“限界上下文”:定义领域边界4. 定义领域内的“聚合”:细化…

海量小文件问题综述和解决攻略(二)

1. 解决NameNode的内存问题 上面的内容提到过每个block的元数据都需要加载到NameNode的内存中,这导致一个Hadoop集群在NameNode中存储的对象是有上限的,并且对象太多会带来启动时间较长以及网络延迟的问题。常见的有两种解决方案,减少集群的…

《开发避坑指南:从异常中读懂系统的“求救信号”》

异常现象从不只是孤立的“故障”,而是系统发出的“健康预警”。太多团队困在“出现问题-临时修复-再次复发”的循环里,将精力消耗在表面问题的扑救上,却忽视了背后潜藏的架构缺陷、逻辑漏洞与环境适配盲区。真正成熟的开发思维,是…

数字孪生技术为UI前端赋能:实现产品性能的实时监测与预警

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!过去十年,前端技术栈翻天覆地:React/Vue/Angular、Webpack/Vite、Serve…

【性能优化】Unity 渲染优化全解析:Draw Call、Batch、SetPass 与批处理技术

Unity 渲染优化全解析:Draw Call、Batch、SetPass 与批处理技术 在 Unity 开发中,性能优化是保证游戏流畅的核心环节。尤其在移动端或 VR/AR 场景,Draw Call 过多、材质切换频繁都会严重影响帧率。 本文将从 Unity Statistics 面板参数解析…

基于Spring Boot的短信平台平滑切换设计方案

基于Spring Boot的短信平台平滑切换设计方案 案例背景 在电商系统中,短信服务是用户注册、登录验证、订单通知等环节的关键基础设施。由于业务需求或成本优化,企业可能需要在不同短信平台(如阿里云、腾讯云、云片等)之间进行切换。…

信息技术发展

信息技术是研究如何获取信息、处理信息、传输信息和使用信息的技术。计算机硬件控制器、运算器、存储器、输入设备、输出设备。计算机软件系统软件、应用软件、中间件。通信系统包括源系统、传输系统、目的系统。网络基础 个人局域网、局域网、城域网、广域网、公用网、专用网。…

2023年12月GESP5级C++真题解析,包括选择判断和编程

一、选择题(每道题2分,共30分) 1、下面C代码用于求斐波那契数列,该数列第1 、2项为1,以后各项均是 前两项之和。下面有关说法错误的是( ) A. fiboA( ) ⽤递归⽅式,fiboB() 循环⽅式 B. fiboA( ) 更加符合…

C++ 面试高频考点 力扣 704.二分查找 基础二分查找 题解 每日一题

文章目录二分查找:从基础原理到代码实现二分查找的特点算法重点题目描述:LeetCode 704. 二分查找为什么可以用二分查找?暴力算法解法二分查找解法核心逻辑:三种情况的处理二分查找什么时候结束?为什么二分查找一定是对…

《UE5_C++多人TPS完整教程》学习笔记45 ——《P46 待机与跳跃动画(Idle And Jumps)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P46 待机与跳跃动画(Idle And Jumps)》 的学习笔记,该系列教学视频为计算机工程师、程序员、游戏开发者、作家(Engineer, Programmer, Game Developer, Author&#xff09…