【应用】SpringBoot-自动配置原理
前言
本文简要介绍SpringBoot的自动配置原理。
本文讲述的SpringBoot版本为:3.1.2。
前置知识
在看原理介绍之前,需要知道@Import注解的作用:
- 可以导入@Configuration注解的配置类、声明@Bean注解的bean方法;
- 可以导入ImportSelector的实现类;【自动配置原理用到注解的这个作用】
- 可以导入ImportBeanDefinitionRegistrar的实现类。
原理介绍
从启动类入手
一个常规的SpringBoot项目的启动类内容如下:

从启动类上的@SpringBootApplication入手:

三个注解箭头指示的注解,各有各的作用:
@SpringBootConfiguration:组合了@Configuration注解,表示这是一个配置类@EnableAutoConfiguration:允许自动配置@ComponentScan:Spring的组件扫描,默认扫描main方法所在类所在的包及其子包
其中第二个注解@EnableAutoConfiguration是实现自动配置的关键。
从@EnableAutoConfiguration注解入手:

可以看到该注解中有一个@Import注解,先说结论:在AutoConfigurationImportSelector类中加载了哪些需要自动配置的Bean,并完成加载,注入到IOC容器中。
到AutoConfigurationImportSelector类
从AutoConfigurationImportSelector类入手:

可以看出:AutoConfigurationImportSelector类是org.springframework.boot.autoconfigure包下的一个类,实现了DeferredImportSelector等接口
org.springframework.boot.autoconfigure:望名生意,自动配置,就是在该包里面,规定了哪些Bean需要配置。DeferredImportSelector:该接口是实现自动配置的关键,里面的selectImports方法规定了哪些Bean需要自动配置。
往下滑,看AutoConfigurationImportSelector类的selectImports方法:

红框所示代码:返回了需要自动配置的Bean列表。
从this.getAutoConfigurationEntry方法入手:
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {if (!this.isEnabled(annotationMetadata)) {return EMPTY_ENTRY;} else {AnnotationAttributes attributes = this.getAttributes(annotationMetadata);// 获取该类所在包下的META-INF/spring/目录中以.imports为后缀结尾的文件里面的内容,作为候选配置列表List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);// 去除重复的配置configurations = this.removeDuplicates(configurations);// 排除部分元注解信息中需要排除的配置Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);this.checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);// 过滤掉一些暂时不生效的配置:加了如下注解的bean:@OnxxxConditionconfigurations = this.getConfigurationClassFilter().filter(configurations);this.fireAutoConfigurationImportEvents(configurations, exclusions);return new AutoConfigurationEntry(configurations, exclusions);}
}
该方法中代码的逻辑如上。就剩一个this.getCandidateConfigurations方法需要再探究,里面规定了从哪个地方寻找需要配置的bean列表。
从this.getCandidateConfigurations方法入手:

再进入箭头所指向的load方法:

可以看到:该方法往包下的META-INF/spring/目录中寻找后缀名为.imports的文件。
到org.springframework.boot.autoconfigure包中看看
从idea左侧的依赖列表里面查看:


点开文件里面任意一个类:


都是一个自动配置类,定义有相应的Bean方法。
至此,SpringBoot的自动配置原理就明白了。
原理总结
- 启动类中有一个@SpringBootApplication注解,包含了@EnableAutoConfiguration代表开启自动装配
- @EnableAutoConfiguration注解里面组合了一个
@Import注解,这个注解是实现自动配置的关键。 @Import注解最终的作用可以总结如下:到spring-boot-autoconfigure包下的META-INF/spring目录中寻找.imports结尾的文件,这里面列举了所有需要自动配置的类,程序会读取这些类并加载(但这些类不会全部加载,因为有的类上面有条件注解,需要满足特定条件时才会生效)- spring-boot-autoconfigure包下的
AutoConfigurationImportSelector类实现了ImportSelector,并重写了selectImports方法 - 在
selectImports方法中,定义类自动配置类的加载位置。还有一些配置类的去重操作、排除操作等。
- spring-boot-autoconfigure包下的
相关文章:
【应用】SpringBoot-自动配置原理
前言 本文简要介绍SpringBoot的自动配置原理。 本文讲述的SpringBoot版本为:3.1.2。 前置知识 在看原理介绍之前,需要知道Import注解的作用: 可以导入Configuration注解的配置类、声明Bean注解的bean方法;可以导入ImportSele…...
中文编程入门(Lua5.4.6中文版)第十二章 Lua 协程 参考《愿神》游戏
在《愿神》的提瓦特大陆上,每一位冒险者都拥有自己的独特力量——“神之眼”,他们借助元素之力探索广袤的世界,解决谜题,战胜敌人。而在提瓦特的科技树中,存在着一项名为“协同程序”的高级秘术,它使冒险者…...
C++笔记之注册回调函数常见的5种情况对比
C++笔记之注册回调函数常见的5种情况对比 —— 2024-04-10 code review! 文章目录 C++笔记之注册回调函数常见的5种情况对比1.五种情况2.示例2.1. `RegisterCallback` 和 `Callback` 都是普通函数2.2. `RegisterCallback` 是成员函数,`Callback` 是普通函数2.3. `RegisterC…...
人工智能揭示矩阵乘法的新可能性
人工智能揭示矩阵乘法的新可能性 数学家酷爱漂亮的谜题。当你尝试找到最有效的方法时,即使像乘法矩阵(二维数字表)这样抽象的东西也会感觉像玩一场游戏。这有点像尝试用尽可能少的步骤解开魔方——具有挑战性,但也很诱人。除了魔方…...
实在智能携手长江新零售俱乐部:探秘实在Agent数字员工,开启零售品牌增长新篇章
近日,实在智能携手长江新零售俱乐部成功举办了“AIGC:数字员工助力零售品牌新增长”主题活动,成功吸引了二十余家企业中高层管理精英的踊跃参与。在此次活动中,与会者围绕零售业数字化转型的当前态势、面临的挑战及其重要性进行了…...
计算机科学与导论 第十七 十八章 计算理论,人工智能
文章预览: 计算理论17.1 引言17.2 简单语言17.3 图灵机邱奇 -图灵 论题 人工智能引言18.1.1 什么是人工智能18.1.2 智能体18.1.3 编程语言 18.2 知识的表示18.2.1 语义网18.2.2 框架18.2.3 谓词逻辑18.2.4 基于规则的系统 18.2 专家系统18.3 语言理解18.4 搜索18.5 …...
linux 设置定时任务---学习
1、设置定时任务 crontab -e 设置格式参考:【Linux】Linux crontab 命令定时任务设置_crontab 设置每天10:30执行-CSDN博客 测试过程: */1 * * * * /root/cronjob.sh 脚本内容: echo "hell0 cronjob" >> /root/test/hello.txt 实现…...
钡铼IOy系列模块深挖工业场景需求提供丰富多样的I/O解决方案
钡铼IOy系列模块以其灵活性和多样性,在工业场景中提供了丰富多样的I/O解决方案,满足了不同行业、不同应用场景的需求。以下是一些常见的工业场景需求及钡铼IOy系列模块提供的解决方案: 1. 工厂自动化 需求:工厂自动化需要对生产线…...
【刷题笔记】第三天
两道简单题 文章目录 [2923. 找到冠军 I](https://leetcode.cn/problems/find-champion-i/description/)[3095. 或值至少 K 的最短子数组 I](https://leetcode.cn/problems/shortest-subarray-with-or-at-least-k-i/description/) 2923. 找到冠军 I 方法1: 如果 i …...
开源模型应用落地-LangChain试炼-CPU调用QWen1.5(一)
一、前言 尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。 通过langchain框…...
STM32-模数转化器
ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换 为离散的数字信号的器件。 ADC相关参数说明: 分辨率: 分辨率以二进制(或十进制)数的位数来表示,一般有 8 位、10 位、12 位、16 位…...
算法刷题记录2
4.图 4.1.被围绕的区域 思路:图中只有与边界上联通的O才不算是被X包围。因此本题就是从边界上的O开始递归,找与边界O联通的O,并标记为#(代表已遍历),最后图中剩下的O就是:被X包围的O。图中所有…...
中国代工巨头旗下芯片公司遭网络攻击,千兆字节数据被泄露
近日,中国智能手机代工巨头闻泰科技旗下荷兰芯片制造商Nexperia发布声明,称其遭遇网络攻击,有未经授权的第三方访问了公司的 IT 服务器,目前已向相关部门报告了此次事件,并与网络安全专家合作开启调查。而据相关消息&a…...
【ARM 裸机】汇编 led 驱动之基本语法
我们要编写的是 ARM 汇编,编译使用的是 gcc 交叉编译器,所以要符合 GNU 语法。 1、汇编指令 汇编由一条条指令构成,ARM 不能直接访问存储器,比如 RAM 中的数据,I.MX6UL 中的寄存器就是 RAM 类型的,我们用…...
scala---基础核心知识(变量定义,数据类型,流程控制,方法定义,函数定义)
一、什么是scala Scala 是一种多范式的编程语言,其设计初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序。 二、为什么要学习scala 1、优雅 2、速度快 3、能融合到hado…...
OSPF星型拓扑和MGRE全连
一,拓扑 二,要求 1,R6为ISP只能配置IP地址,R1-R5的环回为私有网段 2,R1/4/5为全连的MGRE结构,R1/2/3为星型的拓扑结构, 3,R1为中心站点所有私有网段可以互相通讯,私有网段…...
智能时代中的工业应用中前所未有的灵活桥接和I/O扩展功能解决方案MachXO2系列LCMXO2-1200HC-4TG100I FPGA可编程逻辑IC
lattice莱迪斯 MachXO2系列LCMXO2-1200HC-4TG100I超低密度FPGA现场可编程门阵列,适用于低成本的复杂系统控制和视频接口设计开发,满足了通信、计算、工业、消费电子和医疗市场所需的系统控制和接口应用。 瞬时启动,迅速实现控制——启动时间…...
php:实现压缩文件上传、解压、文件更名、压缩包删除功能
效果图 1.上传文件 2.压缩包文件 3.itemno1文件 或 4.上传到系统路径\ItemNo 5.更名后的itemno1文件(命名:当天日期六位随机数) 代码 <form action"<?php echo htmlspecialchars($_SERVER[PHP_SELF], ENT_QUOTES, UTF-8); ?>" methodpost en…...
【机器学习】科学库使用第5篇:Matplotlib,学习目标【附代码文档】
机器学习(科学计算库)完整教程(附代码资料)主要内容讲述:机器学习(常用科学计算库的使用)基础定位、目标,机器学习概述定位,目标,学习目标,学习目标,1 人工智能应用场景,2 人工智能小…...
Java面试八股文(JVM篇)(❤❤)
Java面试八股文_JVM篇 1、知识点汇总2、知识点详解:3、说说类加载与卸载11、说说Java对象创建过程12、知道类的生命周期吗?14、如何判断对象可以被回收?17、调优命令有哪些?18、常见调优工具有哪些20、你知道哪些JVM性能调优参数&…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
