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,也可以直接在注解中设置name
    public 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-雷神,在加上自己的一些理解而写的,要是理解的话可以看此视频进行更深入的理解

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【沉默的羔羊心理学】汉尼拔的“移情”游戏:操纵与理解的艺术,精神分析学视角下的角色互动

终极解读《沉默的羔羊》&#xff1a;弗洛伊德精神分析学视角下的深层剖析 关键词 沉默的羔羊弗洛伊德精神分析学角色心理意识与潜意识性别与身份 弗洛伊德精神分析学简介 弗洛伊德的精神分析学是心理学的一个重要分支&#xff0c;主要关注人类行为背后的无意识动机和冲突。…

字玩FontPlayer开发笔记3 性能优化 大量canvas渲染卡顿问题

字玩FontPlayer开发笔记3 性能优化 大量canvas渲染卡顿问题 字玩FontPlayer是笔者开源的一款字体设计工具&#xff0c;使用Vue3 ElementUI开发&#xff0c;源代码&#xff1a; github: https://github.com/HiToysMaker/fontplayer gitee: https://gitee.com/toysmaker/fontpl…

javaEE-网络编程-3 UDP

目录 Socaket套接字 UDP数据报套字节编程 1.DatagrameSocket类 DatagramSocaket构造方法: DatagramSocaket常用方法&#xff1a; 2.DatagramPacket类 DatagramPacket构造方法&#xff1a; UDP回显服务器实现 UDP服务端实现&#xff1a; 创建一个Socket类对象&#xf…

Linux:操作系统不朽的传说

操作系统是计算机的灵魂&#xff0c;它掌控着计算机的硬件和软件资源&#xff0c;为用户和应用程序提供了一个稳定、高效、安全的运行环境。 在众多操作系统中&#xff0c;Linux 的地位举足轻重。它被广泛应用于服务器、云计算、物联网、嵌入式设备等领域。Linux 的成功离不开…

模拟出一个三维表面生成表面点,计算体积,并处理边界点

python代码 生成表面点,计算体积,并处理边界点,最终模拟出一个三维表面。 步骤: 初始参数设置: initial_fixed_point:一个初始固定点的坐标。 slop_thre:坡度阈值。 v_thre:体积阈值。 slope_rad:将坡度从度转换为弧度。 step_size:步长。 lam_x, lam_y:泊松分布的…

STM32拓展 低功耗案例1:睡眠模式 (register)

需求描述 让MCU进入睡眠模式&#xff0c;然后通过串口发送消息来唤醒MCU退出睡眠模式。观察LED在进入休眠模式后是否仍然开启。 思考 首先睡眠模式&#xff0c;唤醒的条件是中断&#xff0c;外部内部都可以&#xff0c;这里的串口接收中断时内部中断。 拓展&#xff1a;中断…

vue 基础参数增加多语言配置

js 对数组的增删改查 字段在数据库存储为nvarchar &#xff0c;varchar存储波斯语会乱码 数组格式&#xff1a; {"en": [{"type": "10","value": "Confirm","color": ""},{"type": "…

[桌面运维]windows自动设置浅深色主题

设置自动浅色/深色主题 我看很多up主的教程过于繁琐&#xff0c;需要添加四个功能&#xff0c;并且有些还不能生效&#xff01; 大多数都是教程&#xff1a; 自动任务栏浅色 add HKCUSOFTWAREMicrosoftWindowsCurrentVersionThemesPersonalize/v SystemUsesLightTheme /t …

[ubuntu-22.04]ubuntu不识别rtl8153 usb转网口

问题描述 ubuntu22.04插入rtl8153 usb转网口不识别 解决方案 安装依赖包 sudo apt-get install libelf-dev build-essential linux-headers-uname -r sudo apt-get install gcc-12 下载源码 Realtek USB FE / GBE / 2.5G / 5G Ethernet Family Controller Softwarehttps:/…

基于Python的考研学习系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

图漾相机基础操作

1.客户端概述 1.1 简介 PercipioViewer是图漾基于Percipio Camport SDK开发的一款看图软件&#xff0c;可实时预览相机输出的深度图、彩色图、IR红外图和点云图,并保存对应数据&#xff0c;还支持查看设备基础信息&#xff0c;在线修改gain、曝光等各种调节相机成像的参数功能…

Yocto 项目中的包管理系统详细解析

1. 包管理系统概念 包管理系统是用于管理软件包的工具和机制&#xff0c;包括创建、分发和安装软件包。Yocto 项目支持以下三种主要的包管理系统及其相关包格式&#xff1a; IPK (Itsy Package System)&#xff1a;适合轻量级嵌入式应用&#xff0c;通过 OPKG 管理。RPM (Red…

RISC-V学习笔记

1.RISC ISA1个基本整数指令集多个可选的扩展指令集&#xff0c;如RV32I表示支持32位整数指令集。I表示基本指令集&#xff0c;M表示整数乘法与除法指令集&#xff0c;A表示存储器原子指令集&#xff0c;F表示单精度浮点指令集&#xff0c;D表示双精度浮点指令集等&#xff0c;C…

第四届计算机、人工智能与控制工程

第四届计算机、人工智能与控制工程 The 4th International Conference on Computer, Artificial Intelligence and Control Engineering 重要信息 大会官网&#xff1a;www.ic-caice.net 大会时间&#xff1a;2025年1月10-12日 大会地点&#xff1a;中国合肥 (安徽大学磬苑…

Docker安装易有云(casaos安装易有云)

无法拉取易有云&DDNSTO Docker镜像&#xff1f; 官方视频 Docker方式安装易有云&#xff0c;包括并不限于Unraid/爱快/群晖等&#xff0c;只要有Docker的设备都成&#xff0c;包括一些Linux发行版等。 铁威马&#xff1a;首先在应用中心里安装Docker(TOS 4.0及更高的系统…

【计算机视觉技术 - 人脸生成】2.GAN网络的构建和训练

GAN 是一种常用的优秀的图像生成模型。我们使用了支持条件生成的 cGAN。下面介绍简单 cGAN 模型的构建以及训练过程。 2.1 在 model 文件夹中新建 nets.py 文件 import torch import torch.nn as nn# 生成器类 class Generator(nn.Module):def __init__(self, nz100, nc3, n…

手机投屏到电视的3种选择:无线本地投屏,无线远程投屏,AirPlay投屏

现在大部分手机投屏都要求连接相同的WiFi&#xff0c;这就意味着手机投屏到电视必须是近距离投屏&#xff0c;稍微远一点就会脱离WiFi连接范围&#xff0c;投屏失败。 如果想将手机远程投屏到安卓电视&#xff0c;要怎样做&#xff1f; 第一步&#xff0c;在手机和安卓电视都安…

zookeeper 数据类型

文章目录 引言I Znodezonde stat (状态信息)znode类型临时\永久序列化特性引言 在结构上与标准文件系统非常类似,拥有一个层次的命名空间,都是采用树形层次结构 Zookeeper树中的每个节点被称为:Znode,没有文件和目录之分。Znode兼具文件和目录两种特点Znode存储数据大小有…

73 mysql replication 集群的交互

前言 新建两个数据库, 分别为 192.168.220.132:3001, 192.168.220.132:3002 设置 192.168.220.132:3001 为 master, 192.168.220.132:3002 为 slave 配置文件如下 然后使用 mysqld --initialize 来初始化 data 目录, 以及相关基础数据库 这里会为 root 账户创建一个随机的…

CG顶会论文阅读|《科技论文写作》硕士课程报告

文章目录 一、基本信息1.1 论文基本信息1.2 课程基本信息1.3 博文基本信息 二、论文评述&#xff08;中英双语&#xff09;2.1 研究问题&#xff08;Research Problem&#xff09;2.2 创新点&#xff08;Innovation/Contribution&#xff09;2.3 优点&#xff08;Why this pape…