当前位置: 首页 > news >正文

【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注解的作用是什么?

  1. @SpringBootConfiguration注明该类为配置类
  2. @EnableAutoConfiguration完成自动装配
  3. @ComponentScan完成扫描路径

🍙SpringBoot怎么实现自动装配的?

  1. 通过 @EnableAutoConfiguration注解找到所有的META-INF/spring.factories文件
  2. 拿到key为org.springframework.boot.autoconfigure.EnableAutoConfiguration的value
  3. 去除掉不符合条件的bean,满足@Conditional注解等信息的bean才会注册
  4. 在run方法中注册符合条件的bean,run方法会扫描@SpringBootApplication里面的信息,从而注册进入ioc(重要,因为run方法才能使@SpringBootApplication注解生效)

得到了一个规律:

几乎所有自动配置类都叫xxxAutoConfiguration

在这里插入图片描述

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

在这里插入图片描述
码文不易,多多点赞

在这里插入图片描述

相关文章:

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?

SpringBoot源码下载地址&#xff1a;https://github.com/spring-projects/spring-boot/tags 文章目录&#x1f35f;下载源码&#x1f357;环境准备&#x1f356;注解解析&#x1f35d;SpringBootConfiguration注解&#x1f35b;EnableAutoConfiguration注解&#x1f364;AutoC…...

2023-4-10-用Pthreads计算积分

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f;&#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xff0…...

什么是js?js的基本使用

JavaScript&#xff08;简称“ js”&#xff09; 是一种具有函数优先的轻量级&#xff0c;解释型或即时编译型的编译语言虽然它是作为开发WEB页面的脚本语言而出名&#xff0c;但是它也被用到了很多非浏览器环境中&#xff0c;JavaScript 基于原型编程、多范式的动态脚本语言&a…...

自然数的拆分问题 字典序

目录 自然数的拆分问题 字典序 程序设计 程序分析 自然数的拆分问题 字典序 对于大于1的自然数N,可以拆分成若干个大于等于1的自然数之和。 Input 一个大于1的自然数N Output 所有的拆分情况.按字典序排列。 Sample Input...

软件测试——概念篇

目录 一、软件的生命周期 二、瀑布模型&#xff08;Waterfall Model&#xff09; 优点&#xff1a; 缺点&#xff1a; 三、螺旋模型&#xff08;Spiral Model&#xff09; ​编辑优点&#xff1a; 缺点&#xff1a; 四、增量、迭代 区别&#xff1a; 五、敏捷 scrum…...

Qsort函数的应用与讲解

解释&#xff1a; qsort排序函数&#xff0c;即讲一段数组&#xff0c;字符串等进行有序的排列 分析&#xff1a; void qsort (void* base,//要排序的数组的首元素&#xff08;就是数组名&#xff09;size_t num, //要排序的数组元素的个数size_t size,//每个元素的字节大小&…...

蓝桥杯嵌入式第九届客观题解析

文章目录 前言一、题目1二、题目2三、题目3四、题目4五、题目5六、题目6七、题目7八、题目8九、题目910、题目10总结前言 本篇文章为大家带来第九届客观题的讲解。 一、题目1 STM32F103RBT6 微控制器是一款基于 ARM Cortex-M3 内核的单片机,它具有多个外设和总线,包括 APB1…...

多元函数的基本概念——“高等数学”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是多元函数的基本概念&#xff0c;下面&#xff0c;让我们一起进入多元函数的世界吧 平面点集 多元函数的概念 多元函数的极限 多元函数的连续性 有界闭区域上多元连续函数的性质 平面点集 第一个是坐标平…...

LabVIEW-数值控件和布尔控件

简介 LabVIEW 以其强大、开放、图形化的虚拟仪器软件开发环境使得无论是否有过编程经验的工程师或科学家使用它时都可以快速、高效地与测量和控制硬件通信&#xff0c;并进行复杂的数据分析及处理。LabVIEW集成了满足GPIB、PXI、VXI、RS232、RS485、USB、DAQ等多种形式的设备互…...

R730重组阵列raid5

如何进入阵列界面&#xff0c;可以参考这篇文章&#xff1a;R730服务器热插拔换磁盘&#xff08;raid阵列&#xff09; 首先来到阵列界面&#xff1a;来到红框Disk Group处&#xff0c;然后按F2 然后移到箭头处&#xff0c;回车&#xff08;删掉磁盘组&#xff09; 然后发现…...

Verilog学习笔记3——数据位宽、阻塞/非阻塞赋值、二进制码、独热码、格雷码比较、编写原则、三态门、

文章目录前言一、数据位宽1、有符号定点数2、Nbit和Mbit相加或相乘二、阻塞赋值和非阻塞赋值三、timescale四、三态门的设计五、verilog模块编程原则六、二进制码、独热码、格雷码比较1、独热码2、格雷码3、二进制码前言 2023.4.5 清明节 一、数据位宽 N位有符号数&#xff1…...

C++ Qt智能指针使用教程

C++ Qt智能指针使用教程 contents 一、 QSharedPointer用法二、 QWeakPointer三、QScopedPointer四、QPointer五、Qt智能指针需要注意的坑Qt提供了类似C++11智能指针的实现,用于自动管理动态分配的内存,避免内存泄漏和悬挂指针等问题。使用智能指针可以使代码更加安全、简洁和…...

【题解】BZOJ4975 区间翻转

题目大意 两人博弈&#xff0c;有一个 nnn 的排列 a1,a2,…,ana_1,a_2,\dots,a_na1​,a2​,…,an​&#xff0c;每次操作为选择长度为 4x24x24x2 或 4x34x34x3 的区间&#xff0c;将其翻转&#xff0c;要求翻转后字典序大于翻转前。第一个不能操作的输。Q 先手&#xff0c;T 后…...

火箭参数相关知识

火箭参数相关 前言&#xff1a;学习笔记&#xff0c;很初级部分内容来之相关书籍&#xff0c;入门学习&#xff0c;欢迎指正 1 坐标系右手定则&#xff1a; 伸开手掌&#xff0c;大拇指指向X轴&#xff0c;四指指向Y轴&#xff0c;四指弯曲90后所指向的方向为Z轴。X 、Y、Z并…...

【JavaEE】死锁是什么?如何避免死锁(保姆级讲解)

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶本篇文章将介绍什么是死锁&#xff0c;死锁的四大必要条件&#xff0c;如何去避免死锁~~~ 目录 一、死锁是什么&#xff1f; 二、关于死锁的情况 2.1 一个线程的情况 2.2 两个线程的情况…...

JS 实现占位符截取字符串内容

//charnum占位长度&#xff0c; //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&#xff08;Trend Changepoints&#xff09; Prophet中的自动更改点检测&#xff08;Automatic changepoint detection in Prophet&#xff09; 调整趋势灵活性&#xff08;Adjusting trend flexibility&#xff09; 指定变更点的位置&#xff08;Spe…...

超表面学习 初步印象

超表面学习中 第一章 初步认识 一.传统超表面 1.吸波 2.反射相位 3.透射相位 4.电磁带隙 引申出来的超表面基础应用&#xff1a; 1.透波透镜&#xff08;对应透射相位&#xff09; 分为近场和远场 近场&#xff1a;贝塞尔波束等等 远场&#xff1a;方向图控制&#xff08;对应…...

脂肪肝 肾结石 怎么得来的

脂肪肝怎么得来的1.脂肪肝2.肾结石是如何产生的&#xff1f;1.脂肪肝 是由于肝细胞内脂肪堆积过多引起的慢性疾病&#xff0c;引起脂肪肝的因素有多种&#xff0c;由于常常没有自觉症状&#xff0c;往往不易引起人们的重视。常见原因有以下几种&#xff1a; 第一、过量饮酒&a…...

Python 进阶指南(编程轻松进阶):一、处理错误和寻求帮助

原文&#xff1a;http://inventwithpython.com/beyond/chapter1.html 请您不要将计算机当成佣人&#xff0c;因为这样会让您常常感觉很烦躁。比如说当计算机向您显示错误消息时&#xff0c;并不是因为您冒犯了它。计算机是我们大多数人都会接触到的最复杂的工具&#xff0c;但归…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...