【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?
SpringBoot源码下载地址:https://github.com/spring-projects/spring-boot/tags
文章目录
- 🍟下载源码
- 🍗环境准备
- 🍖注解解析
- 🍝@SpringBootConfiguration注解
- 🍛@EnableAutoConfiguration注解
- 🍤@AutoConfigurationPackage注解
- 🍱@ComponentScan注解
- 🍣所以这篇博客解决了标题的问题
- 🍥@SpringBootApplication注解的作用是什么?
- 🍙SpringBoot怎么实现自动装配的?
🍟下载源码
我们下载2.2.9.RELEASE版本,2.3.0以上版本需要用gradle构建
解压完之后运行maven安装命令
mvn clean install -DskipTests
🍗环境准备
在springboot源码项目下创建一个新的模块,这样方便我们debug源码

🍖注解解析
点进去我们可以看到一共有七个注解

上面四个是java原生的注解,我们不用管它
🍝@SpringBootConfiguration注解

它的作用就是标识springboot启动类为bean
🍛@EnableAutoConfiguration注解

该注解是启动自动装配的功能,这就是springboot能自动装配的核心
🍤@AutoConfigurationPackage注解

@Import注解是spring中的注解,这里不再赘述他的作用,这里面导入了一个AutoConfigurationPackages.Registrar.class
Registrar静态内部类

register方法

所以AutoConfigurationPackage注解的目的是将BasePackages类注册进ioc中
再回到@EnableAutoConfiguration注解的import注解中

AutoConfigurationImportSelector类

他实现了很多的Aware接口,Aware接口的作用就是回调函数,他在spring运行的过程中会调用他的接口方法并且将入参赋值给子类的成员变量

我们进入到该类的process方法中
org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.AutoConfigurationGroup#process
在执行的过程中会回调改方法

进入完成装配的方法getAutoConfigurationEntry


org.springframework.boot.autoconfigure.EnableAutoConfiguration,待会要拿的key值

要取的文件

所以getAutoConfigurationEntry方法里面的getCandidateConfigurations方法获取了
META-INF/spring.factories文件中的key(org.springframework.boot.autoconfigure.EnableAutoConfiguration)值

我们去看看所有key是META-INF/spring.factories文件


这些全限定类名就是自动装配的关键

我们不可能把124个bean注册到ioc中,所以我们经过一系列的过滤得到了最终的23个bean
而去除这些bean的关键就是下面这段代码
//去除不需要注册的beanconfigurations = removeDuplicates(configurations);Set<String> exclusions = getExclusions(annotationMetadata, attributes);checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);configurations = filter(configurations, autoConfigurationMetadata);
其中最重要的方法是filter方法

我们举个例子,去看一下RabbitAutoConfiguration类


@ConditionalOnClass注解中没有满足classpath目录(pom文件导入jar)下有RabbitTemplate.class, Channel.class 类的即不装配
还有很多内置spring的@Conditional注解的springboot注解


关于条件注解的讲解
@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。
·@ConditionalOnBean:仅仅在当前上下文中存在某个对象时,才会实例化一个Bean。
·@ConditionalOnClass:某个class位于类路径上,才会实例化一个Bean。
·@ConditionalOnExpression:当表达式为true的时候,才会实例化一个Bean。基于SpEL表达式的条件判断。
·@ConditionalOnMissingBean:仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean。
·@ConditionalOnMissingClass:某个class类路径上不存在的时候,才会实例化一个Bean。
剩下createBean就交给spring去处理就好了
@EnableAutoConfiguration注解已经讲完了
🍱@ComponentScan注解

常用属性如下:
·basePackages、value:指定扫描路径,如果为空则以@ComponentScan注解的类所在的包为基本的扫描路径
·basePackageClasses:指定具体扫描的类
·incIudeFiIters:指定满足FiIter条件的类
·excludeFilters:指定排除FiIter条件的类
因为@ComponentScan注解没有basePackages、value属性,所以springboot会默认扫描启动类所在的包
🍣所以这篇博客解决了标题的问题
🍥@SpringBootApplication注解的作用是什么?
- @SpringBootConfiguration注明该类为配置类
- @EnableAutoConfiguration完成自动装配
- @ComponentScan完成扫描路径
🍙SpringBoot怎么实现自动装配的?
- 通过 @EnableAutoConfiguration注解找到所有的
META-INF/spring.factories文件 - 拿到key为
org.springframework.boot.autoconfigure.EnableAutoConfiguration的value - 去除掉不符合条件的bean,满足@Conditional注解等信息的bean才会注册
- 在run方法中注册符合条件的bean,run方法会扫描@SpringBootApplication里面的信息,从而注册进入ioc
(重要,因为run方法才能使@SpringBootApplication注解生效)
得到了一个规律:
几乎所有自动配置类都叫xxxAutoConfiguration

而在yaml或者properties文件中配置的key都是xxxProperties

码文不易,多多点赞

相关文章:
【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?
SpringBoot源码下载地址:https://github.com/spring-projects/spring-boot/tags 文章目录🍟下载源码🍗环境准备🍖注解解析🍝SpringBootConfiguration注解🍛EnableAutoConfiguration注解🍤AutoC…...
2023-4-10-用Pthreads计算积分
🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥💟💟喜欢的朋友可以关注一下࿰…...
什么是js?js的基本使用
JavaScript(简称“ js”) 是一种具有函数优先的轻量级,解释型或即时编译型的编译语言虽然它是作为开发WEB页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言&a…...
自然数的拆分问题 字典序
目录 自然数的拆分问题 字典序 程序设计 程序分析 自然数的拆分问题 字典序 对于大于1的自然数N,可以拆分成若干个大于等于1的自然数之和。 Input 一个大于1的自然数N Output 所有的拆分情况.按字典序排列。 Sample Input...
软件测试——概念篇
目录 一、软件的生命周期 二、瀑布模型(Waterfall Model) 优点: 缺点: 三、螺旋模型(Spiral Model) 编辑优点: 缺点: 四、增量、迭代 区别: 五、敏捷 scrum…...
Qsort函数的应用与讲解
解释: qsort排序函数,即讲一段数组,字符串等进行有序的排列 分析: void qsort (void* base,//要排序的数组的首元素(就是数组名)size_t num, //要排序的数组元素的个数size_t size,//每个元素的字节大小&…...
蓝桥杯嵌入式第九届客观题解析
文章目录 前言一、题目1二、题目2三、题目3四、题目4五、题目5六、题目6七、题目7八、题目8九、题目910、题目10总结前言 本篇文章为大家带来第九届客观题的讲解。 一、题目1 STM32F103RBT6 微控制器是一款基于 ARM Cortex-M3 内核的单片机,它具有多个外设和总线,包括 APB1…...
多元函数的基本概念——“高等数学”
各位CSDN的uu们你们好呀,今天,小雅兰的内容是多元函数的基本概念,下面,让我们一起进入多元函数的世界吧 平面点集 多元函数的概念 多元函数的极限 多元函数的连续性 有界闭区域上多元连续函数的性质 平面点集 第一个是坐标平…...
LabVIEW-数值控件和布尔控件
简介 LabVIEW 以其强大、开放、图形化的虚拟仪器软件开发环境使得无论是否有过编程经验的工程师或科学家使用它时都可以快速、高效地与测量和控制硬件通信,并进行复杂的数据分析及处理。LabVIEW集成了满足GPIB、PXI、VXI、RS232、RS485、USB、DAQ等多种形式的设备互…...
R730重组阵列raid5
如何进入阵列界面,可以参考这篇文章:R730服务器热插拔换磁盘(raid阵列) 首先来到阵列界面:来到红框Disk Group处,然后按F2 然后移到箭头处,回车(删掉磁盘组) 然后发现…...
Verilog学习笔记3——数据位宽、阻塞/非阻塞赋值、二进制码、独热码、格雷码比较、编写原则、三态门、
文章目录前言一、数据位宽1、有符号定点数2、Nbit和Mbit相加或相乘二、阻塞赋值和非阻塞赋值三、timescale四、三态门的设计五、verilog模块编程原则六、二进制码、独热码、格雷码比较1、独热码2、格雷码3、二进制码前言 2023.4.5 清明节 一、数据位宽 N位有符号数࿱…...
C++ Qt智能指针使用教程
C++ Qt智能指针使用教程 contents 一、 QSharedPointer用法二、 QWeakPointer三、QScopedPointer四、QPointer五、Qt智能指针需要注意的坑Qt提供了类似C++11智能指针的实现,用于自动管理动态分配的内存,避免内存泄漏和悬挂指针等问题。使用智能指针可以使代码更加安全、简洁和…...
【题解】BZOJ4975 区间翻转
题目大意 两人博弈,有一个 nnn 的排列 a1,a2,…,ana_1,a_2,\dots,a_na1,a2,…,an,每次操作为选择长度为 4x24x24x2 或 4x34x34x3 的区间,将其翻转,要求翻转后字典序大于翻转前。第一个不能操作的输。Q 先手,T 后…...
火箭参数相关知识
火箭参数相关 前言:学习笔记,很初级部分内容来之相关书籍,入门学习,欢迎指正 1 坐标系右手定则: 伸开手掌,大拇指指向X轴,四指指向Y轴,四指弯曲90后所指向的方向为Z轴。X 、Y、Z并…...
【JavaEE】死锁是什么?如何避免死锁(保姆级讲解)
博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE初阶本篇文章将介绍什么是死锁,死锁的四大必要条件,如何去避免死锁~~~ 目录 一、死锁是什么? 二、关于死锁的情况 2.1 一个线程的情况 2.2 两个线程的情况…...
JS 实现占位符截取字符串内容
//charnum占位长度, //str 字符串内容 //返回charnum占位长度 下的字符串长度; function getcharlength(charnum,str){ var len 0; for (var i 0; i < str.length; i) { var c str.charCodeAt(i); //单字节加1 …...
Prophet学习(四)趋势Changepoints
目录 趋势Changepoints(Trend Changepoints) Prophet中的自动更改点检测(Automatic changepoint detection in Prophet) 调整趋势灵活性(Adjusting trend flexibility) 指定变更点的位置(Spe…...
超表面学习 初步印象
超表面学习中 第一章 初步认识 一.传统超表面 1.吸波 2.反射相位 3.透射相位 4.电磁带隙 引申出来的超表面基础应用: 1.透波透镜(对应透射相位) 分为近场和远场 近场:贝塞尔波束等等 远场:方向图控制(对应…...
脂肪肝 肾结石 怎么得来的
脂肪肝怎么得来的1.脂肪肝2.肾结石是如何产生的?1.脂肪肝 是由于肝细胞内脂肪堆积过多引起的慢性疾病,引起脂肪肝的因素有多种,由于常常没有自觉症状,往往不易引起人们的重视。常见原因有以下几种: 第一、过量饮酒&a…...
Python 进阶指南(编程轻松进阶):一、处理错误和寻求帮助
原文:http://inventwithpython.com/beyond/chapter1.html 请您不要将计算机当成佣人,因为这样会让您常常感觉很烦躁。比如说当计算机向您显示错误消息时,并不是因为您冒犯了它。计算机是我们大多数人都会接触到的最复杂的工具,但归…...
全民拼购的“低门槛+全权益”,到底戳中了商业的哪个命门
一、先给全民拼购画个像:不是“割韭菜”,是“普惠式信任游戏”老陈一开始也怕:“拼购不都是‘砍一刀免费拿’‘拉3人返现’吗?我可不想踩红线。”我跟他说:新型全民拼购和传统拼购的本质区别,是“从‘赚快钱…...
避坑指南:Ubuntu 22.04安装PyTorch时,关于CUDA版本和驱动那些最容易踩的雷
避坑指南:Ubuntu 22.04安装PyTorch时,关于CUDA版本和驱动那些最容易踩的雷 如果你正在Ubuntu 22.04上搭建PyTorch开发环境,很可能已经遇到了几个令人困惑的问题:为什么nvidia-smi和nvcc -V显示的CUDA版本不一致?为什么…...
中创新航发布2025年度业绩:总收入444亿元同比增长60% 盈利能力跨越式提升
3月27日,中创新航(03931.HK)发布2025年度业绩公告。公告显示,公司全年总收入444.00亿元人民币,同比增长约60.0%;年内利润20.95亿人民币,同比增长约148.4%,盈利能力实现跨越式提升&am…...
AI Agent开发实战路线图:从入门到企业级应用的4阶段进阶指南
第一阶段|概念入门:从认知到代码 理解 AI Agent 的工作原理与架构。推荐课程:Microsoft《AI Agents for Beginners》、Hugging Face《AI Agents》。核心学习点:感知、决策、行动、反馈循环机制。第二阶段|核心技术&…...
抖音无水印下载工具:高效批量下载解决方案
抖音无水印下载工具:高效批量下载解决方案 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在短视频内容创作与数字资产管理领域,抖音平台的海量内容为创作者提供了丰富的素材来源。然…...
【RL-CISPO】MiniMax-M1: Scaling Test-Time Compute Efficiently with Lightning Attention
note CISPO是2025年6月minimax提出,放到今天还是有价值的。CISPO强化学习: 传统 PPO / GRPO 这类方法,在做 token 级 clipping 时, 会把一些“低概率但很关键”的 token(这类token一般是反思、转折、纠错、重新检查等…...
Mamba模型实战:如何用S6替代Transformer处理长文本(附代码示例)
Mamba模型实战:如何用S6替代Transformer处理长文本(附代码示例) 在自然语言处理领域,Transformer架构因其强大的注意力机制而长期占据主导地位。然而,当面对长文本处理任务时,Transformer的二次方计算复杂度…...
ReadMe.md
一、先告诉你:这个项目是干嘛的? 这是一套网页自动化 E2E 测试框架用来自动打开浏览器 → 自动点页面 → 自动校验功能是否正常 二、最关键:你必须先做的 1 件事(否则跑不起来) 在项目根目录创建 .env 文件 项目根目录…...
【obs studio】从零开始:高效录制屏幕与声音的完整指南
1. 为什么选择OBS Studio录制屏幕与声音? 如果你正在寻找一款免费、开源且功能强大的屏幕录制工具,OBS Studio绝对是你的不二之选。我最初接触这款软件是因为需要录制一些技术教程,试过市面上不少付费软件后,发现OBS Studio不仅完…...
工业质检新突破:如何用GLAD扩散模型实现高精度无监督异常检测(附MVTec-AD实测)
工业质检革命:GLAD扩散模型如何重塑无监督缺陷检测 在制造业智能化转型浪潮中,工业质检环节正经历着从人工目检到AI视觉的范式转移。传统基于规则或监督学习的检测系统面临标注成本高、泛化能力弱等痛点,而无监督异常检测技术凭借"零样本…...
