SpringBoot的自动配置原理探究

目录

什么是SpringBoot的自动配置(Auto-Configuration)

举例:SpringBoot自动配置(Redis的自动配置)的实例:

步骤1.:引入Redis启动器pom依赖

步骤2.在application.yml或者(properties,yaml)的配置文件配置redis服务器的连接信息

步骤3.我们就可以通过自动装配 直接使用 RedisTemplate和StringRedisTemplate

 SpringBoot的源码分析:

        步骤一:项目从启动类开始启动,就会实现自动配置,所以我们从启动开始看主动类中只包含了一个run方法(返回IOC容器),和一个@SpringBootApplication注解。

步骤二:@SpringBootApplication 注解内部源码

步骤三:@EnableAutoConfiguration  注解内部源码

步骤四:AutoConfigurationImportSelector.class内部源码内部实现了DeferredImportSelector接口,属于ImportSelector接口的子接口,

 步骤五:getAutoConfigurationEntry方法内部源码内部通过getCandidateConfigurations获取所有的bean对象

 步骤六:getCandidateConfigurations内部源码由其内部断言翻译可知,自动配置是通过  META-INF/spring.factories 的文件实现,它会将此文件内部所有满足条件的Bean交由IOC容器管理,实现自动配置。

总结原理:@EnableAutoConfiguration 注解内部使用 @Import(AutoConfigurationImportSelector.class)来加载配置类。配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,

当 SpringBoot应用启动时,会自动加载这些配置类,初始化Bean,并不是所有的Bean都会被初始化,在配置类中使用Condition来加载满足条件的Bean

自定义(Redis-starter)启动器:要求导入redis坐标时,SpringBoot自动创建Jedis(Java版本API)的bean

步骤一:创建redis-spring-boot-autoconfiguration自动配置模块。

步骤二:创建启动器模块,内部不需要实现任何类,

步骤三:创建我们自己的模块,尝试导入自己建立的启动器,通过打印Jedis依赖,查看是否成功。

运行结果:由结果可知,我们自动启动器成功,并且实现了外部自定义端口和ip


什么是SpringBoot的自动配置(Auto-Configuration)

SpringBoot项目启动后,会将pom.xml中依赖的配置文件中的类交给IOC容器管理,我们就可以通过@Autowired自动装配使用。那么它是怎样实现的,我们下面一起学习了解。

举例:SpringBoot自动配置(Redis的自动配置)的实例:
步骤1.:引入Redis启动器pom依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
步骤2.在application.yml或者(properties,yaml)的配置文件配置redis服务器的连接信息

注意:还可以配置数据库信息,密码等。

spring:redis:port: 6060 #端口host: 127.0.0.2 #ip
步骤3.我们就可以通过自动装配 直接使用 RedisTemplate和StringRedisTemplate

 问题提出:

        整个过程,我们就只通过maven导入了redis的starter启动器依赖,然后就可以直接使用RedisTemplate和StringRedisTemplate等Bean对象,SpringBoot就自动完成了Redis配置,
并且将相关的Bean对象注册加载到IOC容器中了,那么SpringBoot是如何做到的?

 SpringBoot的源码分析:

        步骤一:项目从启动类开始启动,就会实现自动配置,所以我们从启动开始看
主动类中只包含了一个run方法(返回IOC容器),和一个@SpringBootApplication注解。

步骤二:@SpringBootApplication 注解内部源码

步骤三:@EnableAutoConfiguration  注解内部源码

步骤四:AutoConfigurationImportSelector.class内部源码内部实现了DeferredImportSelector接口,属于ImportSelector接口的子接口,

实现ImportSelector接口selectImports方法必须要重写selectImports方法,并返回一个字符串数组,并将字符串数组内部的所有符合条件的类交由IOC管理。

 重写的selectImports方法:其内部还是通过getAutoConfigurationEntry方法获取所有需要自动配置的所有符合条件的类,并转换为String[] 返回。

 步骤五:getAutoConfigurationEntry方法内部源码
内部通过getCandidateConfigurations获取所有的bean对象

 步骤六:getCandidateConfigurations内部源码
由其内部断言翻译可知,自动配置是通过  META-INF/spring.factories 的文件实现,它会将此文件内部所有满足条件的Bean交由IOC容器管理,实现自动配置。

以RedisAutoConfiguration源码观察:它会判断条件,将符合条件的对象交由IOC容器管理

在断言处打断点,debug可知,SpringBoot在启动时,它会把它认知的144个满足条件的类()全部交给IOC容器管理,实现自动配置。

总结原理:
@EnableAutoConfiguration 注解内部使用 @Import(AutoConfigurationImportSelector.class)来加载配置类。
配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,
当 SpringBoot应用启动时,会自动加载这些配置类,初始化Bean,并不是所有的Bean都会被初始化,在配置类中使用Condition来加载满足条件的Bean

自定义(Redis-starter)启动器:要求导入redis坐标时,SpringBoot自动创建Jedis(Java版本API)的bean

        观察Mybatis的自动配置可知,它包含了两个模块,一个自动配置的功能模块,一个依赖管理的启动器模块,我们用只用启动器的依赖管理模块。那么我们定义时,也需要两个模块,一个自动配置模块,一个依赖管理模块

步骤一:创建redis-spring-boot-autoconfiguration自动配置模块。

并在内部pom.xml导入Jedis依赖。

通过配置类,注入jedis 的Bean对象,增加配置文件,给其添加默认的端口,IP,

端口和IP,我们可以导入启动器依赖后,可在项目的配置文件中更改。

RedisAutoconfiguration.java(配置类)

ReidsProperties.java

注意:图中报红,并非错误,不影响,

重点:我们知道,自动配置的文件存在在METE-INF下的spring.factories文件下

//创建此文件,并将我们需要配置的redis自动配置类,放入,让其加载。

导入依赖:

<!--引入jedis依赖-->
<dependencies>

        <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>3.8.0</version>
</dependency>

步骤二:创建启动器模块,内部不需要实现任何类,

只需要导入我们创建的自动配置模块依赖

 

步骤三:创建我们自己的模块,尝试导入自己建立的启动器,通过打印Jedis依赖,查看是否成功。

 

运行结果:由结果可知,我们自动启动器成功,并且实现了外部自定义端口和ip

好的,我们对于SpringBoot的自动配置学到此处就结束了,如有不足或错误之处,请批评指正。

谢谢!

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

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

相关文章

XXL-JOB漏洞分析与利用

一、前言 在当今的数字化时代&#xff0c;任务调度平台对于企业级应用来说至关重要。它们负责自动化和协调各种时间敏感或周期性的任务&#xff0c;确保业务流程的顺畅运行。XXL-JOB作为一款流行的分布式任务调度平台&#xff0c;因其强大的功能和易用性&#xff0c;被广泛部署…

vue3父子组件双向数据绑定v-model;父组件调用子组件事件

效果&#xff1a; 父far.vue <template><div><div>父组件内容<pre>value1:{{ value1 }}</pre><el-button type"primary">flag1:{{ flag1 }}</el-button><pre>obj1:{{ obj1 }}</pre><el-input v-model&q…

进阶SpringBoot之 JDBC 篇

对于数据访问层&#xff0c;无论是SQL&#xff08;关系型数据库&#xff09;还是NOSQL&#xff08;非关系型数据库&#xff09;&#xff0c; Spring Boot 底层都是采用 Spring Data 的方式进行统一处理 创建一个新项目&#xff0c;依赖勾选 JDBC API、MySQL Driver 项目创建好…

2024.8.20 作业

目录 思维导图&#xff1a; 面试题练习&#xff1a; 1、C语言中指针数组和数组指针的区别 2、结构体字节对齐的原理 3、TCP和UDP的区别 4、同步通信和异步通信的区别 5、多线程的理解 6、大小端验证 7、互斥锁 8、共享内存特点 9、C语言的指针 10、gcc编译 11、socket套接字 1…

【TCP】确认应答、超时重传机制和TCP报头

TCP 相关机制 TCP 基本特点&#xff1a;有连接、可靠传输、面向字节流、全双工 有连接、面向字节流和全双工都能在前面的代码中体现有连接&#xff1a;必须要先调用 accept 建立联系才能处理面向字节流&#xff1a;会拿到 clientSocket 对象的 InputStream 和 OutputStream&a…

加密请求包的爆破

本文来源无问社区&#xff0c;更多实战内容可前往查看http://wwlib.cn/index.php/artread/artid/10414.html 在平时进行漏洞挖掘的时候经常会在诸如登陆的地方遇到密码经过了加密&#xff0c;而且不是也 base64 或者 md5 啥的&#xff0c;而可能是 RSA 之类的&#xff0c;这就…

Python 办公自动化 案例 将Excel 数据导入数据库 【2】推荐

前言&#xff1a; 前面我们梳理了如何处理Excel数据&#xff0c;详细的回顾了如何读取Excel行、列以及单元格数据&#xff0c;如何创建一个Excel、向Excel填充数据以及保存Excel数据。主要是xlrd读取和xlwt写入两个python第三方模块对Excel数据操作的一些常用函数以及属性。点…

【JVM】深入理解类加载机制(一)

深入理解类加载机制 Klass模型 Java的每个类&#xff0c;在JVM中都有一个对应的Klass类实例与之对应&#xff0c;存储类的元信息如:常量池、属性信息、方法信息…从继承关系上也能看出来&#xff0c;类的元信息是存储在元空间的。普通的Java类在JVM中对应的是InstanceKlass(C)…

4款AI 生成 PPT的工具,帮你赶上演示文稿的新趋势!

AI 生成 PPT 最大的优势就在于它能够帮助我们提高效率。如果我们自己制作的话就需要花费大量的时间去收集资料、构思布局、设计排版。而现在&#xff0c;有了AI工具&#xff0c;一切就迎刃而解&#xff0c;如果大家需要这样的工具&#xff0c;可以看看这4款。 1、笔灵办公 直通…

RabbitMQ 的工作原理

下面是rabbitmq 的工作原理图解 1、客户端连接到消息队列服务器&#xff0c;打开一个channel。 2、客户端声明一个exchange&#xff0c;并设置相关属性。 3、客户端声明一个queue&#xff0c;并设置相关属性。 4、客户端使用routing key&#xff0c; 在exchange和queue 之间…

为什么说网络安全行业是IT行业最后的红利?

前言 2023年网络安全行业的前景看起来非常乐观。根据当前的趋势和发展&#xff0c;一些趋势和发展可能对2023年网络安全行业产生影响&#xff1a; 5G技术的广泛应用&#xff1a;5G技术的普及将会使互联网的速度更快&#xff0c;同时也将带来更多的网络威胁和安全挑战。网络安全…

《向量数据库 Faiss 搭建与使用全攻略》

一、Faiss 概述 Faiss 是由 Facebook AI 团队开发的一款强大工具&#xff0c;在大规模数据处理和相似性搜索领域占据着重要地位。 在当今信息爆炸的时代&#xff0c;数据规模呈指数级增长&#xff0c;如何从海量数据中快速准确地找到相似的数据成为了关键挑战。Faiss 应运而生…

《黑神话.悟空》:一场跨越神话与现实的深度探索

《黑神话.悟空》&#xff1a;一场跨越神话与现实的深度探索 在国产游戏日益崛起的今天&#xff0c;《黑神话.悟空》以其独特的剧情、丰富的人物设定和深刻的主题&#xff0c;成为了无数玩家翘首以盼的国产3A大作。这款游戏不仅是一次对传统故事的创新演绎&#xff0c;更是一场对…

AIoTedge边缘计算平台V1.0版本发布

AIoTedge边缘计算平台V1.0&#xff0c;一款创新的AIoT解决方案&#xff0c;现已正式发布。该产品集成了NodeRED软网关、边缘物联网平台和边缘AI能力&#xff0c;为企业提供强大的边云协同能力。它支持设备管理和泛协议接入&#xff0c;确保不同设备间的无缝连接。AIoTedgeV1.0还…

[C#]winform基于深度学习算法MVANet部署高精度二分类图像分割onnx模型高精度图像二值化

【训练源码】 https://github.com/qianyu-dlut/MVANet 【参考源码】 https://github.com/hpc203/MVANet-onnxrun 【算法介绍】 二分图像分割&#xff08;DIS&#xff09;最近出现在从高分辨率自然图像中进行高精度对象分割方面。在设计有效的DIS模型时&#xff0c;主要的挑战是…

SDCS-IOE-2C 3ADT220090R007模块控制器

SDCS-IOE-2C 3ADT220090R007模块控制器 SDCS-IOE-2C 3ADT220090R007模块控制器 SDCS-IOE-2C 3ADT220090R007模块控制器 SDCS-IOE-2C 3ADT220090R007模块控制器引脚线 SDCS-IOE-2C 3ADT220090R007模块控制器说明书 SDCS-IOE-2C 3ADT220090R007模块控制器线路图 SDCS-IOE-2…

Snipaste 的一款替代工具 PixPin,支持 gif 截图、长截图和 OCR 文字识别,功能不是一点点强!

Snipaste 的一款替代工具 PixPin&#xff0c;支持 gif 截图、长截图和 OCR 文字识别&#xff0c;功能不是一点点强&#xff01; PixPin 的名字来源于“Pixel Pin”&#xff0c;简单来说是一个截图、贴图的工具&#xff0c;但是 PixPin 以截图和贴图两大功能为核心做了大量的优…

mysql速起架子

wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz 下载mysql tar xvJf mysql-8.0.21-linux-glibc2.12-x86_64.tar.xz 解压 mv mysql-8.0.21-linux-glibc2.12-x86_64 mysql-8.0 改名 去到bin目录 cd bin mkdir data gr…

Python(PyTorch)硅光电倍增管和量化感知训练亚光子算法验证

&#x1f3af;要点 &#x1f3af;亚光子光神经网络矩阵计算 | &#x1f3af;光学扇入计算向量点积 | &#x1f3af;表征测量确定不同光子数量下计算准确度 | &#x1f3af;训练全连接多层感知器基准测试光神经网络算法数字识别 | &#x1f3af;物理验证光学设备设置 | &#x…

Controller中接收数组参数 post请求中在body中传+post请求中通过表单形式传(x-www-form-urlencoded)

1、场景 需要根据用户id集合批量删除用户数据&#xff0c;前端使用post请求&#xff0c;controller中参数接收数组参数并根据用户id删除用户基本信息 2、分析处理&#xff1a; 2.1、前端请求类型contentType:application/json 请求体中为json字符串&#xff0c;后端新建一个Us…