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

2023-05-16

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的关键就是下面这段代码


		//去除不需要注册的bean
		configurations = 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

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

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 微信小程序:截图组件welCropper,实现原理及其使用

    最近做项目的时候 xff0c 需要做一个截图功能 用了一个别人写的截图工具 xff0c 发现截出的图质量下降了 xff0c 但是我们图片要用来做识别 需要保证截出的图质量不下降 而且也不支持通过拖动来调整截图框的大小 所以这个截图工具无法满
  • 时序数据从分表到分库

    这里的时序数据泛指一切随时间推移而不断增长的数据 xff0c 比如通话记录 银行交易记录等 对于数据库来讲 xff0c 时序数据并没有什么特殊性 xff0c 可以和普通数据一样放在数据表中 不过 xff0c 因为不断增长 xff0c 积累时
  • Elasticsearch7.1中文文档-第一章-入门

    入门 引言 Elasticsearch是一个高度可扩展开源的全文搜索引擎 它搜索几乎是实时的 用ES作为搜索引擎 为复杂搜索功能的需求提供解决方案 ES的使用场景 网上商场 搜索商品 ES配合logstash kibana 日志分析 本教程
  • VINS(一)简介与代码结构

    VINS Mono和VINS Mobile是香港科技大学沈劭劼团队开源的单目视觉惯导SLAM方案 是基于优化和滑动窗口的VIO xff0c 使用IMU预积分构建紧耦合框架 并且具备自动初始化 xff0c 在线外参标定 xff0c 重定位 x
  • QTableView中设置单元格居中

    在获取想要设置的单元格对应的QStandardItem item xff0c 然后设置此item文本属性属性 xff0c 伪码如下 xff1a QStandardItem item 61 new QStandarItem 或者 GetQSt
  • MacBook Pro休眠掉电、耗电量大问题解决方案

    1 前言 最近我的2015mbpMacBook Pro Retina 13 inch early 2015 更新完10 14系统后 xff0c 发现休眠待机一晚上后能掉5 电 xff0c 白天待机4 5小时又掉了8 然而在此之前我记得休眠是
  • 推荐一本springBoot学习书籍---深入浅出springBoot2.x

    花了几周时间读完了这本书 确实是一本特别详细全面的书 而且不单单只是springBoot 书中还介绍了许多工作中常用的技术与springBoot的整合使用 当然 也有一些小bug 因为在代码实践过程发现和书中代码还是有区别的 当然我只发现了
  • 【simple-cache】我开发了一款只要一个注解就可以轻松实现缓存的框架

    x1f436 背景 xff1a 我们在写web项目的时候 xff0c 当大量的请求进来会导致我们数据库压力过大 xff0c 所以我们需要加入缓存来减轻数据库的压力 xff0c 但是现在市面上的很多缓存框架配置太复杂 xff0c 所以该框架只
  • 转载——为什么你睡了11个小时仍然觉得疲累?

    教你如何休息 为什么你睡了11个小时仍然觉得疲累 xff1f 为什么你花了好几万去岛国度假并没有增加生活的热情 xff1f 都说要去KTV xff0c 去夜店 xff0c 去游乐园就能忘掉不快 xff0c 更带劲地开始新的一天 xff0c
  • GreenPlum 数据库创建用户、文件空间、表空间、数据库

    前几篇文章介绍了GreenPlum数据库的安装 启动 关闭 状态检查 登录等操作 xff0c 数据库已经创建好了 xff0c 接下来介绍如何使用数据库 按照习惯 xff0c 需要先创建测试用户 表空间 数据库 先创建测试用户dbdream
  • 将Lua嵌入到自己的程序中

    什么是Lua Lua是具有简单数据描述的扩展编程语言 动态解析语言 它提供了非常好的面向对象编程 xff0c 函数式编程 functional programming xff0c 数据驱动式编程 data driven programmin
  • OpenCV——像素数据类型总结<摘>

    1 Unsigned 8bits 一般的图像文件格式使用的大小 IplImage数据结构参数 xff1a IPL DEPTH 8U CvMat数据结构参数 xff1a CV 8UC1 xff0c CV 8UC2 xff0c CV 8UC3
  • 关于warning: Clock skew detected. Your build may be incomplete. 的解决方法

    今天发现电脑的系统时间不对 xff0c 因此将时钟进行了改动 xff0c 回头编译Linux kernel的时候 xff0c 提演示样例如以下的warning xff1a warning Clock skew detected Your b
  • 8-4.桶排序算法详解

    1 桶排序介绍 桶排序 Bucket sort 是一种基于计数的排序算法 xff0c 工作的原理是将数据分到有限数量的桶子里 xff0c 然后每个桶再分别排序 xff08 有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序 xff
  • 我的年终总结,作为研发,在2018年都有哪些进步、收获与成长?

    2018 结束了 部门开会总结了过去的工作与未来的展望 xff0c 也是个不错的机会去回顾 审视 思考自己的 2018 年 玄难说过人与人的差距来自于思考与总结 xff0c 我深深地认同这一点 我也把自己的一部分思考写下来 xff0c 在公
  • cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local ..

    在安装opencv的时候 xff0c 会用 xff1a cmake D CMAKE BUILD TYPE 61 RELEASE D CMAKE INSTALL PREFIX 61 usr local 很久这这句话什么意思 xff01 在bu
  • 谈谈项目售前的经验:(个人观点)

    谈谈自己多年做网络项目售前的经验 个人观点 1 售前要熟悉市场 特别是你从事项目的决策链 项目的商务价格 同类项目竞争对手的价格分析等等 2 售前要熟悉项目的运作方式 实施 管理 客户的需求的深度挖掘 熟悉技术营销和解决方案营销 3 售前要
  • 【拥抱开源】发布自己的项目到maven中央仓库

    文章目录 x1f388 第一步 xff0c 注册账号 x1f4bf 第二步 xff0c 登录 x1f4c0 第三步 xff0c 设置信息 x1f4be 第四步 xff0c 创建问题 x1f4f9 第五步 xff0c 验证信息 x1f3a5
  • c# ros

    class MK Stream connection TcpClient con public MK string ip con 61 new TcpClient con Connect ip 8728 connection 61 Stre
  • Ubuntu中使用Docker/LXC迅速启动一个桌面系统

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 2013年07月18日 标签 cloud container docker lxc 作者 xff1a vpsee Docker 是 dotCloud 最近几个月刚宣布的开源

随机推荐