SpringBoot的自动配置原理探究

news2024/9/28 7:28:22

目录

什么是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.coloradmin.cn/o/2066977.html

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

相关文章

火狐浏览器应用商店不支持下载

前言 之前手机一直用的火狐浏览器&#xff0c;现在换了新的手机&#xff0c;又想下载使用&#xff0c;从官网直接下载现在直接跳载到Google Play才能下载&#xff0c;但是国内又用不了的&#xff0c;这里就记录一下怎么在手机应用商店不支持情况下载。 从FTP服务器下载Beta版…

C++学习笔记----4、用C++进行程序设计(四)---- 复合关系与继承关系之间的细线

在现实世界只是很容易区分对象之间是复合关系还是继承关系。没有人会说桔子有一个水果--而只能是桔子是一种水果。但是&#xff0c;在代码中&#xff0c;有时候就不是那么清晰了。 设想有一个代表关联数组的假想类&#xff0c;将一个键影射到一个值的数据结构。例如&#xff0c…

python画图高斯平滑均值曲线

注:细线是具体值,粗线是高斯平滑处理后的均值曲线 #codinggbk import matplotlib.pyplot as plt import numpy as np from scipy.ndimage import gaussian_filter1d# 生成一些示例数据 np.random.seed(0) timesteps np.linspace(1000, 0, 1000) data 0.4 0.2 * np.random.r…

并查集(路径压缩、按秩合并、按大小合并)

文章目录 并查集简单介绍&#xff1a;初始化&#xff1a;如何查找&#xff1f;如何合并&#xff1f;优化如下&#xff1a;路径压缩&#xff1a;代码&#xff1a; 按秩合并&#xff1a;**代码&#xff1a;** 启发式合并&#xff08;按大小合并&#xff09;&#xff1a;代码: 例题…

E5063A-011 时域分析/测试向导程序

矢量网络分析 E5063A 选件 011 E5063A-011 时域分析/测试向导程序 不容错过&#xff01; 概述 Keysight E5063A ENA 系列 PCB 分析仪是较佳的 PCB 生产测试解决方案&#xff0c;可提供阻抗&#xff08;TDR&#xff09;和回波损耗&#xff08;S 参数&#xff09;测量能力。…

11091 最优自然数分解问题(优先做)

### 简短思路 #### 问题&#xff08;1&#xff09;&#xff1a;将n分解为若干个互不相同的自然数之和&#xff0c;且使这些自然数的乘积最大 1. 对于n < 4的情况&#xff0c;直接返回特定值。 2. 对于n > 4的情况&#xff0c;使用贪心策略&#xff0c;将n分解为从2开始的…

证书学习(一)keytool 工具使用介绍

目录 一、keytool 简介1.1 什么是 keytool&#xff1f;1.2 主要功能&#xff1a;1.3 使用场景1.4 常用命令1.5 默认参数 二、keytool 用法说明2.1 基本使用2.2 创建密钥库和密钥条目2.3 查看密钥库信息2.4 导出密钥库条目证书2.5 导入信任证书到密钥库2.6 打印证书内容2.7 删除…

零工市场小程序应该有什么功能?

数字经济现如今正飞速发展&#xff0c;零工市场小程序在连接雇主与自由职业者方面发挥着越来越重要的作用。一个高效的零工市场小程序不仅需要具备基础的信息发布与匹配功能&#xff0c;还应该涵盖交易管理、安全保障以及个性化服务等多个方面。 那么&#xff0c;零工市场小程…

为什么企业跨国组网建议用SD-WAN?

SD-WAN成为企业跨国组网的首选方案&#xff0c;主要因为它在灵活性、智能化管理以及数据安全等方面具备显著优势。在企业进行跨国组网时&#xff0c;往往会面临网络连接复杂、流量管理难度大以及数据安全等诸多挑战&#xff0c;而SD-WAN能够有效应对这些难题。 首先&#xff0c…

Docker续1:

一、打包传输 1.打包 [rootlocalhost ~]# systemctl start docker [rootlocalhost ~]# docker save -o centos.tar centos:latest [rootlocalhost ~]# ls anaconda-ks.cfg centos.tar 2.传输 [rootlocalhost ~]# scp centos.tar root192.168.1.100:/root 3.删除镜像 [r…

场外个股期权杠杆率是多少如何计算倍数?

今天带你了解场外个股期权杠杆率是多少如何计算倍数&#xff1f;场外个股期权的杠杆大小不是固定的&#xff0c;而是取决于期权合约的价值和标的资产的价值之间的比例&#xff0c;一般来说场外个股期权的杠杆率大概在5-30倍甚至更高左右。 场外个股期权杠杆率是多少&#xff1…

罗德与施瓦茨RS SMW200A 最实用的一款矢量信号发生器

Rohde & Schwarz SMW200A 是一款适用于最苛刻应用的矢量信号发生器。由于其灵活性、性能和直观的操作&#xff0c;它是生成复杂、高质量数字调制信号的完美工具。 罗德与施瓦茨 SMW200A 是开发新型宽带通信系统、验证 3G 和 4G 基站或航空航天和国防领域所需的数字调制信号…

【软考】cpu的组成

目录 1. 说明2. cpu结构图3. 运算器3.1 说明3.2 主要功能3.3 算术逻辑单元3.4 累加寄存器3.5 数据缓冲寄存器DR3.6 状态条件寄存器PSW 4. 控制器4.1 说明4.2 指令寄存器(IR)4.3 程序计数器(PC)4.4 地址寄存器(AR)4.5 指令译码器(DD) 5. 寄存器组6. 例题6.1 例题1 1. 说明 1.cp…

Lighthouse ApexZ 尘埃粒子计数器审计追踪 数据完整性

在大型制药企业中&#xff0c;高效、准确且安全的样本处理与数据管理至关重要。这些企业不仅需要确保产品质量符合严格的监管要求&#xff0c;还需要优化流程以提高生产效率和降低成本。结合您提到的LIMS&#xff08;实验室信息管理系统&#xff09;和Lighthouse ApexZ便携式空…

行星搅拌炒锅的优点有哪些?

1、容积大&#xff0c;产量高。 2、火力大&#xff0c;独特的燃烧装置&#xff0c;升温快&#xff0c;温度高&#xff0c;炒出的物料色泽鲜艳&#xff0c;口味纯正。 3、不糊锅&#xff0c;独特的搅拌装置&#xff0c;可以覆盖锅体的每一个角落&#xff0c;使物料不糊锅&…

《黑神话 悟空》大火,通关后部分景区可免门票,72处《黑神话 悟空》取景地汇总!

重要提醒&#xff01;打通关的天命人们 免门票了&#xff01;72处《黑神话 悟空》取景地汇总。 8月20日&#xff0c;首个国产3A大作《黑神话:悟空》上线&#xff0c;这几天&#xff0c;大家基本很难不刷到这个热点。在这个游戏中&#xff0c;去了全国多个景区取景&#xff0c;…

城乡燃气安全监管平台 打造城市安全防护网

随着城市化进程的不断加快&#xff0c;燃气已成为现代生活中不可或缺的重要能源。然而&#xff0c;传统燃气管理方式的局限性逐渐显现&#xff0c;难以应对日益增长的安全监管需求。为此&#xff0c;旭华智能基于其在智慧城市领域的深厚积累&#xff0c;推出了燃气安全监管物联…

Spring Cloud + Easy Excel导出表格

在现代应用开发中&#xff0c;数据的导出和处理是一个非常常见的需求。Spring Cloud 和 Easy Excel 是两个强大的工具&#xff0c;可以帮助我们高效地完成这个任务。本文将介绍如何将这两个工具结合起来&#xff0c;实现表格数据的导出功能。 1.环境准备 在开始之前&#xff0…

shellcode汇编复习

shellcode汇编复习 一、 汇编代码复习二、 基础寄存器1. EAX (Accumulator Register)2. EBX (Base Register)3. ECX (Count Register)4. EDX (Data Register)5. ESI (Source Index Register)6. EDI (Destination Index Register) 二、 基础指令1. mov - 数据传送2. add - 加法3…