【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 请您不要将计算机当成佣人,因为这样会让您常常感觉很烦躁。比如说当计算机向您显示错误消息时,并不是因为您冒犯了它。计算机是我们大多数人都会接触到的最复杂的工具,但归…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
