SpringBoot3-深入理解自动配置类的原理(尚硅谷SpringBoot3-雷神)

文章目录

  • 目录
    • 了解自动配置
  • 一、导入对应场景的Mean依赖:
    • 1、引入依赖
      • **找到自动配置类的所有配置都存放在哪里**
  • 二、编写主程序:@SpringBootApplication
    • 观察源码时所需要知道的几个核心注解:
    • 1、观察@SpringBootApplication源码都做了什么
  • 三、xxxxAutoConfiguration自动配置类
  • 四、编写主程序:@SpringBootApplication


目录

什么是自动配置类:简单的进行分析就是自动的将你需要的类或者jar包进行导入,无需自己配置,而在springBoot中就很好的实现了此功能,我们再写springBoot时一般只需要四步:
1、导入对应场景的Mean依赖
2、编写主程序:@SpringBootApplication
3、xxxxAutoConfiguration自动配置类
4、编写具体的业务代码…

了解自动配置

1、包扫描规则
在springBoot中约定,默认包扫描规则为:只会扫描在主程序(也就是@SpringBootApplication 所标记的类)所在的包及其子包的所有文件,【当然也是可以进行自定义范围的,但是springBoot约定是如此,没有什么特殊要求以约定为准】
2、配置的默认值
在springBoot中,若是在配置文件中的属性都与配置类中的对象一一对应(这时也称此类为属性类),这时只要在配置文件(application.properties/yml/xml)设置了某一个属性的值,此时这个属性的配置类对象的默认值就是对应当前在配置文件中所设置的属性值。
类如我在配置文件中设置了server.port = 8888,此时所对应的**属性类(ServerProperties)**中的对象port就变成了8888,[原理就是调用了ServerProperties中的setPort方法],配置文件中没有写的属性类中的对象,则以SpringBoot官方所约定默认值为准
3、按需加载配置
虽然在spring-boot-dependencies包中有所有场景的配置,但是只有导入对应的场景才会导入对应场景所需要的配置,并不是全部导入。

一、导入对应场景的Mean依赖:

1、引入依赖

这里以javaweb演示:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

找到自动配置类的所有配置都存放在哪里

步骤:
1:找到spring-boot-starter文件(此文件是所有的场景① 所需要依赖的核心场景启动器
2、核心场景启动器引入了spring-boot-autoconfigure包。
3、找到spring-boot-autoconfigure②,所在的jar包位置
:场景是什么:以web场景举例,假设你需要进行编写web项目,在SSM中需要进行导入许多的依赖,而在这里你只需要进行导入web场景,则会直接进行导入这个场景所需要的所有依赖】
:此spring-boot-autoconfigure包中就存放了所有配置类。也就是说只要此包可以生效,即SpringBoot官方写好的整合功能就生效了。
图示:在这里插入图片描述

题外话(依赖管理):为什么没有标记版本号

首先进行观察此依赖会发现并没有写web的版本号,肯定会有人问为什么可以不写,我们可以看到pom.xml文件顶部的<artifactId>spring-boot-starter-parent</artifactId>这串代码可以说明此文件的依赖于spring-boot-starter-parent pom文件,点进去之后又可以看到此依赖又依赖了<artifactId>spring-boot-dependencies</artifactId>,在点进去之后往下滑就可以看到了许多的<XXX.version>…此文件就是进行约定了依赖的版本(注意这里只约定了官方所提供的依赖,而第三方的依赖并没有进行约定)
简单来说:yourPom --(依赖于)–> spring-boot-starter-paren --(依赖于)–> spring-boot-dependencies [而在此pom文件就有约定官方所提供的依赖版本]
图示:
1、你的mean依赖文件:
在这里插入图片描述
2、进入到spring-boot-starter-paren文件:
在这里插入图片描述
3、进入到spring-boot-dependencies文件:在这里插入图片描述

二、编写主程序:@SpringBootApplication

观察源码时所需要知道的几个核心注解:

  1. @Configuration、@SpringBootConfiguration
    - 这两个注解都是将类标识为配置类(所以本质上并没有区别),从而替代了spring的配置xml文件
  2. @Bean、@Scope
    - ①:@Bean:替代了Bean标签
    - ②:@Scope:将bean对象转换为(单实例/多实例)

1和2一般是搭配使用,代码演示:
(这里的实体类代码就不写了,你们可以自己随便写几个实体类进行测试)

配置类代码:

@Configuration//标记为配置类,替代spring配置xml文件
//@SpringBootConfiguration//标记为springBoot的配置类,替代spring配置xml文件
public class configClass1 {@Bean("user001")//替代了Bean标签,默认方法名就是bean对象的name,也可以直接在注解中设置namepublic user user(){//这里就是创建bean对象,user为你创建实体类user user = new user();user.setName("张三");user.setAge(31);user.setGender("男");return user;}
}

在spring中创建bean并完成上述的所有操作:
在这里插入图片描述

测试(主程序代码):

@SpringBootApplication
public class Boot3Demo2Application {public static void main(String[] args) {ConfigurableApplicationContext ioc = SpringApplication.run(Boot3Demo2Application.class, args);/*输出所有ioc容器中所有bean对象name*/for (String name : ioc.getBeanDefinitionNames()) {System.out.println(name);}/*以user类型查询所有的bean对象*/String[] forType = ioc.getBeanNamesForType(user.class);for (String s : forType) {System.out.println(s);}/*判断这两个的指定的对象是否相同(也就可以证明是否是单实例)*/Object user1 = ioc.getBean("user001");Object user2 = ioc.getBean("user001");//若是为false则为多实列,若为true则为单实列System.out.println(user1 == user2);}}

执行结果如下图:
在这里插入图片描述

  • @Import
    • 它也可可以创建bean对象,只需要在配置类上面进行标记即可
@Import(FastsqlException.class)//bean对象name默认为全类名
@Configuration//标记为配置类
public class configClass1 {}

条件注解:

  • @ConditionalOnClass:如果类路径中存在这个类,则触发指定行为
  • @ConditionalOnMissingClass:如果类路径中不存在这个类,则触发指定行为
  • @ConditionalOnBean:如果容器中存在这个Bean(组件),则触发指定行为
  • @ConditionalOnMissingBean:如果容器中不存在这个Bean(组件),则触发指定行为

这几个注解只需要知道什么意思即可,所以就不演示了

属性绑定:

属性绑定就是将创建的bean对象,与配置文件中的属性进行绑定
@ConfigurationProperties
将配置文件中以特定值为前缀的进行与当前标记的类进行绑定(前提是此类必须在容器中)
@EnableConfigurationProperties
标记在配置类中
1.开启pig的属性绑定功能、2.将pig放到ioc容器中
用法如图:
在这里插入图片描述

1、观察@SpringBootApplication源码都做了什么

在**@SpringBootApplication**中是由三个注解组成的:
1、@SpringBootConfiguration :标记为springBoot配置类
2、@ComponentScan:包扫描的注解

3、@EnableAutoConfiguration:用来自动配置的注解
1、首先查看@EnableAutoConfiguration的源码(在SpringBootApplication里面中标记它的注解)
2、在此注解@EnableAutoConfiguration上有着一个@Import,它导入了一个类:{AutoConfigurationImportSelector.class},进入到里面,并找到一个方法,其方法名为:getAutoConfigurationEntry,在这两处进行断点查看:
在这里插入图片描述
3、跳过第一个断点查看属性configurations
会发现加载了许多的配置类,而这些就是我们所需的配置。
在这里插入图片描述
4、那这些配置类从哪里来的?
其实就是从我们上面所说的spring-boot-dependencies包
可以直接找到方法:getCandidateConfigurations,如图:
在这里插入图片描述
在找到autoConfigurationAnnotation并查找此类的全类名:
在这里插入图片描述
此时就可以得知这个jar包的路径为:
META-INF/spring/org.springframework.boot.autoconfigure.imports
这个路径需要再library中进行查找:
在这里插入图片描述
此时就可以知道springBoot是如何进行有效的导入配置。

三、xxxxAutoConfiguration自动配置类

打开存放配置路径的文件(也就是上面最后所打开的文件):在此文件中可以发现,许多的xxxxAutoConfiguration自动配置类,我们可以任意的查看自动配置类可以发现有许多的@Bean注解。
由此可以说明:使用@Bean 在IOC容器中存放了一堆组件

我们可以先打开EmbeddedWebServerFactoryCustomizerAutoConfiguration自动配置类观察一下,看到tomcatWebServerFactoryCustomizer(翻译;TomcatWeb服务器工厂定制器)方法中的返回值:serverProperties(服务器属性)
在这里插入图片描述
我们可以直接进入到此类中,可以发现此类就是一个属性类,且还可以发现一个规律就是所有以XXXProperties结尾的都是一个属性类。

我们可以在EmbeddedWebServerFactoryCustomizerAutoConfiguration类中查看注解,会发现一个我们上面所说的注解:@EnableConfigurationProperties({ServerProperties.class}),
作用:
1、开启ServerProperties类的属性绑定功能
2、将ServerProperties放到ioc容器中
由此可以推断:每个自动配置类都可能有这个注解@EnableConfigurationProperties(XXXProperties.class),用来把配置文件中指定前缀的属性值封装到 xxxProperties属性类中
这里要是没找到的话可以带开这几个自动配置类
ReactiveMultipartAutoConfigurationHttpEncodingAutoConfigurationThymeleafAutoConfiguration…都可以找到EnableConfigurationProperties注解,且都将属性类作为参数

由上面的内容就可以进行推断:
IOC容器中放的所有组件(就是在自动配置类中所标记@Bean的方法) 的一些 核心参数(就是我们在配置文件中可以修改的属性例如:端口),都来自于xxxProperties。
xxxProperties都是和配置文件绑定
此时:只需要改配置文件的值,核心组件的底层参数都能修改

四、编写主程序:@SpringBootApplication

到这里就已经完成了自动装配等事情…


以上是我看尚硅谷SpringBoot3-雷神,在加上自己的一些理解而写的,要是理解的话可以看此视频进行更深入的理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/65124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mongo高可用架构解决方案

Mongo主从复制哪些事(仅适用特定场景) 对数据强一致性要求不高的场景,一般微服务架构中不推荐 master节点可读可写操作,当数据有修改时,会将Oplog(操作日志)同步到所有的slave节点上。那么对于从节点来说仅只读,所有slave节点从master节点同步数据,然而从节点之间互相…

C#Halcon跨窗口颜色识别

机器视觉是一门让计算机模拟人类视觉功能的学科。颜色识别在其中扮演着重要的角色&#xff0c;它旨在通过对图像中的颜色信息进行分析&#xff0c;从而识别出图像中的目标物体或者区域。例如&#xff0c;在水果分拣系统中&#xff0c;可以根据水果的颜色&#xff08;如苹果的红…

01:C语言的本质

C语言的本质 1、ARM架构与汇编2、局部变量初始化与空间分配2.1、局部变量的初始化2.1、局部变量数组初始化 3、全局变量/静态变量初始化化与空间分配4、堆空间 1、ARM架构与汇编 ARM简要架构如下&#xff1a;CPU&#xff0c;ARM(能读能写)&#xff0c;Flash&#xff08;能读&a…

Transformer知识梳理

Transformer知识梳理 文章目录 Transformer知识梳理什么是Transformer&#xff1f;语言模型迁移学习 Transformer结构注意力层原始结构 总结 什么是Transformer&#xff1f; 语言模型 Transformer模型本质上都是预训练语言模型&#xff0c;大部分采用自监督学习&#xff08;S…

第29天:PHP应用弱类型脆弱Hash加密Bool类型Array数组函数转换比较

#知识点&#xff1a; 1、安全开发-原生PHP-弱类型脆弱 2、安全开发-原生PHP-函数&数据类型 3、安全开发-原生PHP-代码审计案例 1、 和 两个等号是弱比较&#xff0c;使用进行对比的时候&#xff0c;php解析器就会做隐式类型转换&#xff0c;如果两个值的类型不相等就会把两…

STM32F1学习——编码器接口

一、编码器接口 编码器接口可以接收正交编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;通过硬件自动控制CNT值的自增或自减&#xff0c;从而指出编码器的位置、旋转方向和旋转速度。 每个高级定时器和通用定时器都有一个编码器接口&#xff0c;他们会占…

网络安全的学习与实践经验(附资料合集)

学习资源 在线学习平台&#xff1a; Hack This Site&#xff1a;提供从初学者到高级难度的挑战任务&#xff0c;适合练习各种网络安全技术。XCTF_OJ&#xff1a;由XCTF组委会开发的免费在线网络安全网站&#xff0c;提供丰富的培训材料和资源。SecurityTube&#xff1a;提供丰…

行业商机信息付费小程序系统开发方案

行业商机信息付费小程序系统&#xff0c;主要是整合优质行业资源&#xff0c;实时更新的商机信息。在当今信息爆炸的时代&#xff0c;精准、高效地获取行业商机信息对于企业和个人创业者而言至关重要。 一、使用场景 日常浏览&#xff1a;用户在工作间隙或闲暇时间&#xff0c…

[Qt] 输入控件 | Line | Text | Combo | Spin | Date | Dial | Slider

目录 输入类控件 1、Line Edit 录入个人信息 使用正则表达式验证输入框的数据 验证两次输入的密码一致 切换显示密码 2、Text Edit 获取多行输入框的内容 验证输入框的各种信号 3、Combo Box 使用下拉框模拟麦当劳点餐 从文件中加载下拉框的选项 4、Spin Box 调整…

Flink CDC 自定义函数处理 SQLServer XML类型数据 映射 doris json字段方案

Flink CDC 自定义函数处理 SQLServer XML类型数据方案 1. 背景 因业务使用SQLServer数据库&#xff0c;CDC同步到doris 数仓。对于SQLServer xml类型&#xff0c;doris没有相应的字段对应&#xff0c; 可以使用json来存储xml数据。需要进行一步转换。从 flink 自定义函数入手…

JeeSite 快速开发平台:全能企业级快速开发解决方案|GitCode 光引计划征文展示

投稿人GitCode ID&#xff1a;thinkgem 光引计划投稿项目介绍 JeeSite 快速开发平台&#xff0c;不仅仅是一个后台开发框架&#xff0c;它是一个企业级快速开发解决方案&#xff0c;后端基于经典组合 Spring Boot、Shiro、MyBatis&#xff0c;前端采用 Beetl、Bootstrap、Admi…

2025/1/4期末复习 密码学 按老师指点大纲复习

我们都要坚信&#xff0c;道路越是曲折&#xff0c;前途越是光明。 --------------------------------------------------------------------------------------------------------------------------------- 现代密码学 第五版 杨波 第一章 引言 1.1三大主动攻击 1.中断…

Java 内存溢出(OOM)问题的排查与解决

在 Java 开发中&#xff0c;内存溢出&#xff08;OutOfMemoryError&#xff0c;简称 OOM&#xff09;是一个常见且棘手的问题。相比于数组越界、空指针等业务异常&#xff0c;OOM 问题通常更难定位和解决。本文将通过一次线上内存溢出问题的排查过程&#xff0c;分享从问题表现…

【51单片机零基础-chapter3:按键:独立按键|||附带常见C语句.逻辑运算符】

将unsigned char var0;看作沟通二进制和十进制的桥梁 var是8位,初始为0000 0000; 同时可以进行十进制的运算 逻辑运算 位运算 & 按位与(有0则0) | 按位或(有1则1) ~ 按位非 ^ 按位异或(相同则1,不同为0) <<按位左移 >>按位右移 位运算符解释: 0011 1100 <&…

游戏如何检测iOS越狱

不同于安卓的开源生态&#xff0c;iOS一直秉承着安全性更高的闭源生态&#xff0c;系统中的硬件、软件和服务会经过严格审核和测试&#xff0c;来保障安全性与稳定性。 据FairGurd观察&#xff0c;虽然iOS系统具备一定的安全性&#xff0c;但并非没有漏洞&#xff0c;如市面上…

在Lua中,Metatable元表如何操作?

Lua中的Metatable&#xff08;元表&#xff09;是一个强大的特性&#xff0c;它允许我们改变表&#xff08;table&#xff09;的行为。下面是对Lua中的Metatable元表的详细介绍&#xff0c;包括语法规则和示例。 1.Metatable介绍 Metatable是一个普通的Lua表&#xff0c;它用于…

12306分流抢票软件 bypass v1.16.43 绿色版(春节自动抢票工具)

软件介绍 12306Bypass分流抢票软件&#xff0c;易操作强大的12306抢票软件&#xff0c;全程自动抢票&#xff0c;云识别验证码打码&#xff0c;多线程秒单、稳定捡漏&#xff0c;支持抢候补票、抢到票自动付款&#xff0c;支持多天、多车次、多席别、多乘客、短信提醒等功能。…

【Go】运行自己的第一个Go程序

运行自己的第一个Go程序 一、Go语言的安装Go环境安装查看是否安装成功配置GOPROXY(代理) 二、Goland安装三、Goland破解四、新建项目 开一篇专栏记录学习Go的过程&#xff0c;一门新语言从hello world开始&#xff0c;这篇文章详细讲解Go语言环境搭建及hello world实现 一、Go语…

计算机的错误计算(二百零一)

摘要 用两个大模型计算 &#xff0c;结果保留 10位有效数字。实验表明&#xff0c;两个大模型的输出均只有1位正确数字&#xff1b;并它们几乎相同&#xff1a;仅最后1位数字不同。 例1. 计算 , 结果保留 10位有效数字。 下面是与一个数学解题器的对话。 以上为与一个数学解…

2024 年度时序数据库 IoTDB 论文总结

论文成果总结 2024 年度&#xff0c;时序数据库 IoTDB 在数据库领域 CCF-A 类国际会议上共发表论文 8 篇&#xff0c;包括&#xff1a;SIGMOD 3 篇、VLDB 3 篇、ICDE 2 篇&#xff0c;涵盖存储、引擎、查询、分析等方面。 2024 最后一天&#xff0c;我们将分类盘点 IoTDB 本年的…