当前位置: 首页 > 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;但归…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

20个超级好用的 CSS 动画库

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

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...