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.rhkb.cn/news/502362.html

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

相关文章

图像分割基础:使用Python和scikit-image库

大家好&#xff0c;今天我们将一起探讨图像分割的基础知识&#xff0c;并使用Python编程语言以及scikit-image库来实现一个简单的图像分割示例。图像分割是图像处理中的一项重要技术&#xff0c;它允许我们将图像划分为多个部分或对象&#xff0c;这对于图像分析和计算机视觉任…

SpringBoot中实现拦截器和过滤器

【SpringBoot中实现过滤器和拦截器】 1.过滤器和拦截器简述 过滤器Filter和拦截器Interceptor&#xff0c;在功能方面很类似&#xff0c;但在具体实现方面差距还是比较大的。 2.过滤器的配置 2.1 自定义过滤器&#xff0c;实现Filter接口(SpringBoot 3.0 开始&#xff0c;jak…

基于LightGBM的集成学习算法

目录 一、LightGBM基本原理1.1 基于直方图的决策树算法1.1.1 连续变量分箱 1.2 互斥特征捆绑1.2.1 互斥特征捆绑计算流程1.2.2 互斥特征捆绑算法基本原理1.2.2.1 冲突比例&#xff08;conflict_rate&#xff09;1.2.2.2 图着色1.2.2.3 特征捆绑 1.3 基于梯度的单边采样&#xf…

trendFinder - 利用 AI 掌握社交媒体上的热门话题

1600 Stars 177 Forks 7 Issues 2 贡献者 MIT License Javascript 语言 代码: https://github.com/ericciarla/trendFinder 更多AI开源软件&#xff1a;AI开源 - 小众AI Trend Finder 收集并分析来自关键影响者的帖子&#xff0c;然后在检测到新趋势或产品发布时发送 Slack 通知…

Level DB --- BloomFilterPolicy

BloomFilterPolicy是Level DB中重要的数据过滤模块&#xff0c;它主要用来先过滤在Block中不存在的key&#xff0c;减少Block的搜索计算量。 Bloom Filter 从原理上来讲Bloom FIlter相对来说原理还是比较简单的&#xff0c;将一个key经过一次&#xff08;组合&#xff09;ha…

ELK 使用教程采集系统日志 Elasticsearch、Logstash、Kibana

前言 你知道对于一个系统的上线考察&#xff0c;必备的几样东西是什么吗&#xff1f;其实这也是面试中考察求职者&#xff0c;是否真的做过系统开发和上线的必备问题。包括&#xff1a;服务治理(熔断/限流) (opens new window)、监控 (opens new window)和日志&#xff0c;如果…

【MySQL】九、表的内外连接

文章目录 前言Ⅰ. 内连接案例&#xff1a;显示SMITH的名字和部门名称 Ⅱ. 外连接1、左外连接案例&#xff1a;查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出来 2、右外连接案例&#xff1a;对stu表和exam表联合查询&#xff0c;把…

机器学习周报-ModernTCN文献阅读

文章目录 摘要Abstract 0 提升有效感受野&#xff08;ERF&#xff09;1 相关知识1.1 标准卷积1.2 深度分离卷积&#xff08;Depthwise Convolution&#xff0c;DWConv&#xff09;1.3 逐点卷积&#xff08;Pointwise Convolution&#xff0c;PWConv&#xff09;1.4 组卷积(Grou…

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

摘要 利用三个大模型化简计算 前面分式的分子为零&#xff0c;因此正确值是后面的数值300.09...321 . 让三个大模型计算&#xff0c;它们均没有看出分式的分子中被减数与减数是相等的。因此&#xff0c;均得出了错误结果。 例1. 化简计算摘要中算式的值。 下面是一个大模型的…

2025-01-04 Unity插件 YodaSheet1 —— 插件介绍

文章目录 1 介绍2 工作原理2.1 ScriptableObject -> YadeSheetData2.2 YadeDatabase 存储多个 YadeSheetData 3 用途4 缺点5 推荐 1 介绍 ​ Yade 提供类似于 Excel 或者 Google Sheets 的表格编辑器&#xff0c;可以轻松地在 Unity 编辑器中 编辑&#xff0c;搜索&#xf…

connect to host github.com port 22: Connection timed out 的解决方法

原因是 Github 被 GFW 屏蔽了。 Windows 系统&#xff0c;打开 C:\Windows\System32\drivers\etc&#xff0c;复制其中的 hosts 文件至桌面&#xff0c;用文本编辑器或者其他工具打开。 复制以下内容进去&#xff1a; 140.82.114.4 github.com 151.101.1.6 github.global.ss…

memcached的基本使用

memcached是一种基于键值对的内存数据库&#xff0c;一般应用于缓存数据&#xff0c;提高数据访问速度&#xff0c;减轻后端数据库压力。 安装 这里以Ubuntu为例&#xff0c;其他系统安装方法请看官方文档。 sudo apt-get update sudo apt-get install memcached启动 memca…

【操作系统不挂科】操作系统期末考试题库<2>(单选题&简答题&计算与分析题&程序分析题&应用题)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 操作系统不挂科 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 目录 一、单项选择题&#xff08;每空2分&#xff0c;共40分&#xff09;1&#xff0e;以下选项中&#xff0c;&#xff08; &#xff09;不是操…

ip属地的信息准确吗?ip归属地不准确怎么办

在数字化时代&#xff0c;IP属地信息成为了我们日常生活中不可或缺的一部分。在各大社交媒体平台上&#xff0c;IP属地信息都扮演着重要的角色。然而&#xff0c;随着技术的不断进步和网络的复杂性增加&#xff0c;IP属地信息的准确性问题也日益凸显。那么&#xff0c;IP属地信…

【GUI-pyqt5】QWidget类

1. 描述 所有可视空间的基类是一个最简单的空白控件控件是用户界面的最小元素 接收各种事件&#xff08;鼠标、键盘&#xff09;绘制在桌面上&#xff0c;显示给用户看 每个控件都是矩形的&#xff0c;它们按z轴顺序排序控件由其父控件和前面的控件剪切没有父控件的控件&#…

Linux(Centos 7.6)命令详解:ls

1.命令作用 列出目录内容(list directory contents) 2.命令语法 Usage: ls [OPTION]... [FILE]... 3.参数详解 OPTION: -l&#xff0c;long list 使用长列表格式-a&#xff0c;all 不忽略.开头的条目&#xff08;打印所有条目&#xff0c;包括.开头的隐藏条目&#xff09…

unity学习6:unity的3D项目的基本界面和菜单

目录 1 unity界面的基本认识 1.1 file 文件 1.2 edit 编辑/操作 1.3 Assets 1.4 gameobject 游戏对象 1.5 组件 1.6 windows 2 这些部分之间的关系 2.1 关联1&#xff1a; Assets & Project 2.2 关联2&#xff1a;gameobject & component 2.3 关联3&#xf…

生成模型的现状2025年的新兴趋势

2024年对人工智能而言是极为出色的一年。在文本生成和图像生成这两方面&#xff0c;我们目睹了模型能力全方位出现了类似阶跃函数般的巨大提升。这一年起始时OpenAI占据主导地位&#xff0c;而到了年末&#xff0c;Anthropic的Claude成了我常用的大型语言模型&#xff0c;并且还…

PWN 的知识之如何利用栈溢出利用后门函数

PWN 的知识之如何利用栈溢出利用后门函数 利用栈溢出漏洞调用原本存在的后门函数&#xff08;例如 get_flag 或system("/bin/sh")&#xff09;是二进制漏洞利用中的一种常见技术,相信各位网安的师傅或多或少都听说过&#xff0c;那么如何利用栈溢出来利用后门函数呢…

基于YOLO11的道路缺陷检测系统

基于YOLO11的道路缺陷检测系统 (价格90) 包含 [cracks, potholes] [裂缝, 凹坑] 2个类 通过PYQT构建UI界面&#xff0c;包含图片检测&#xff0c;视频检测&#xff0c;摄像头实时检测。 &#xff08;该系统可以根据数据训练出的yolo11的权重文件&#xff0c;运用在其他…