Springboot自动配置那些事

news2025/1/21 2:59:14

Spring Boot中默认会扫描的启动类对应的子包下面的类,但是项目引入的其他包下面的类要加入到IOC中必须要有所说明,以下说到的自动配置就是干这个活的,springboot就会把配置中的类加载到ioc容器中。

(1)自动配置注册文件

从Spring boot2.7开始自动配置注册有了一个比较大的调整,之前都是写在下面 文件中的:

META-INF/spring.factories

格式为: org.springframework.boot.autoconfigure.EnableAutoConfiguration=[XXXConfig,YYYConfig]

自Spring Boot 2.7 起改名了:

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

格式也变了,直接每一行是一个自动配置类,比如spring-cloud-netflix-eureka-client-4.0.3.jar 中的该文件内容为:

org.springframework.cloud.netflix.eureka.config.EurekaClientConfigServerAutoConfiguration

org.springframework.cloud.netflix.eureka.config.DiscoveryClientOptionalArgsConfiguration

org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration

org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration

org.springframework.cloud.netflix.eureka.reactive.EurekaReactiveDiscoveryClientConfiguration

org.springframework.cloud.netflix.eureka.loadbalancer.LoadBalancerEurekaAutoConfiguration

(2)注解(@AutoConfiguration)

自Spring Boot 2.7 起新增了一个自动配置注解 @AutoConfiguration,用来代替之前的 @Configuration,用于标识新自动配置注册文件中的顶级自动配置类,由 @AutoConfiguration 注解嵌套、导入进来的其他配置类可以继续使用 @Configuration 注解。

另外,为方便起见,@AutoConfiguration 注解还支持 after, afterNames, before 和 beforeNames 属性进行自动配置排序,用于代替之前的 @AutoConfigureAfter 和 @AutoConfigureBefore 注解。

这个注解可以说更加细分了吧,自动配置专用注解,用专门的注解来干专门的事。

自动配置生效有很多源注解:

​@ConditionalOnBean​​ 配置的bean存在时,才会创建这个bean;

@ConditionalOnMissingBean 配置的bean不存在时,才会创建这个bean;

@ConditionalOnClass Classpath中存在配置的类,才会创建这个bean;

@ConditionalOnMissingClasses Classpath中不存在配置的类,才会创建这个bean;

@ConditionalOnJava JDK版本在范围以内,才会创建这个bean;

@ConditionalOnExpression 指定的SpEL表达式结果为true,才会创建这个bean;

@ConditionalOnWebApplication 是一个WEB应用程序,才会创建这个bean;

@ConditionalOnNotWebApplication 不是一个WEB应用程序,才会创建这个bean;

@ConditionalOnCloudPlatform 仅当我们在某个云平台上运行时才加载bean:

@ConditionalOnJndi("java:comp/env/ejb/myEJB") 仅当通过JNDI提供某个资源时才加载bean:

@ConditionalOnProperty(prefix = "notification", name = "service")仅在存在环境属性()且具有特定值的情况下才启用Bean注册,默认情况下,必须定义指定的属性,并且不等于false。

@ConditionalOnResource(resources="classpath:shiro.ini") 当指定的资源文件出现在classpath中生效

(3)配置提示功能

如下3个文件都是用于配置提示:

spring-configuration-metadata.json

additional-spring-configuration-metadata.json

spring-autoconfigure-metadata.properties

其中spring-configuration-metadata.json和spring-autoconfigure-metadata.properties是插件生成的,additional-spring-configuration-metadata.json一般没额外的补充信息需求的话也不用写。

自定义配置提示只需要在项目中引入如下依赖即可:

dependency>

groupId>org.springframework.bootgroupId>

artifactId>spring-boot-autoconfigureartifactId>

dependency>

dependency>

groupId>org.springframework.bootgroupId>

artifactId>spring-boot-autoconfigure-processorartifactId>

dependency>

dependency>

groupId>org.springframework.bootgroupId>

artifactId>spring-boot-configuration-processorartifactId>

optional>trueoptional>

dependency>

(4)spring-boot-starter-xxx.jar为什么都是空项目?

以spring-cloud-starter-loadbalancer-4.0.4.jar为例,本身是一个空项目,只是依赖项目spring-cloud-loadbalancer-4.0.4.jar。

在spring-cloud-loadbalancer-4.0.4.jar中的关键自动配置部分:

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,

给出了自动配置的信息。

之所以拆分为一个空工程和一个配置工程的原因,只能先猜测一下。

(1)有可能是空的spring-cloud-starter-xxx工程可以有比较灵活的依赖,不一定要和spring-cloud-xxx完全绑死,除了依赖spring-cloud-xxx外还可以依赖其他工程。

但是spring-boot-starter-3.1.4.jar和spring-boot-start-cache-3.1.4.jar和spring-boot-start-freemarker-3.1.4.jar 这些都是空工程,连依赖都没有,根本体现不出来上面的意义啊。

(2)也可能是有名字好理解一点

如果是这个理由,直接把spring-cloud-xxx命名为spring-cloud-starter-xxx,用一个工程不是更好吗,感觉牵强得很。

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

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

相关文章

Gradle version对应的 Gradle Plugin version

Gradle version对应的 Gradle Plugin version

如何成为前1%的程序员

目录 大量同质化的知识,会降低这些知识的含金量。 1、拥抱调试 2、质量胜于数量 3、读取代码 4、贡献 5、工具 如果你想成为前1%的程序员,你必须遵循1%的程序员做什么,了解其他99%的人不做什么。在现代,我们有各种学习平台…

伦敦金周末可以交易吗,黄金休市时间是那些?

伦敦金是国际性投资产品,主要交易中心有亚洲、欧洲和美洲,在时差的作用下,三大市场相互连接,形成了全天24小时几乎不间断的交易时间,也为炒金者们提供了充分的操作机会。即便如此,在一些特定的时间段内&…

C语言打印1/1+1/2+1/3.....+1/50结果

while语句&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int i 1;double sum 0.0;while(i < 50){sum 1.0/i;i;}printf("sum %lf\n",sum);return 0; } for语句&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1#includ…

JTS: 15 Angle 角度计算

这里写目录标题 版本代码 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 package pers.stu.algorithm;import org.locationtech.jts.algorithm.Angle; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.GeometryFactory; imp…

深入浅出继承

目录 一、继承的概念 二、继承的定义 2.1 继承格式 2.2 继承方式与访问限定符 2.3 继承方式和访问限定符 2.4 默认继承方式 三、基类与派生类对象赋值转换 四、继承中的作用域 六、派生类默认成员函数 七、继承与友元 八、继承与静态成员 一、继承的概念 继承&…

【c++】c++类的大小的计算和this指针

文章目录 1.类的大小如何计算&#xff1f;2.类内部的this指针3.this指针的特性 本文为作者关于c类学习过程中的小小总结 1.类的大小如何计算&#xff1f; c的类由成员变量和成员函数等组成&#xff0c;不同于c中的结构体只有成员变量&#xff0c;但类大小的计算方法和结构体的…

Redis中的Set类型

目录 set的相关命令 sadd smembers sismember scard spop smove srem 操作集合间的命令 sinter sinterstore sunion sunionstore sdiff sdiffstore 内部编码 set类型的应用场景 redis中的集合类型是保存多个字符串类型的元素的. 作为集合,有两个关键的特性:1…

CSS实现鼠标移至图片上显示遮罩层及文字效果

效果图&#xff1a; 1、将遮罩层html代码与图片放在一个div 我是放在 .proBK里。 <div class"proBK"><img src"../../assets/image/taskPro.png" class"proImg"><div class"imgText"><h5>用户在线发布任务&l…

C++ 动态规划。。。

#include <iostream> #include <algorithm> using namespace std; // 定义一个常量&#xff0c;表示无穷大 const int INF 1e9; int dp[1000 2];// 定义一个函数&#xff0c;计算数组中某个区间的和 int sum(int arr[], int start, int end) {int s 0;for (int …

【C/C++】什么是POD(Plain Old Data)类型

2023年11月6日&#xff0c;周一下午 目录 POD类型的定义标量类型POD类型的特点POD类型的例子整数类型&#xff1a;C 风格的结构体&#xff1a;数组&#xff1a;C 风格的字符串&#xff1a;std::array:使用 memcpy 对 POD 类型进行复制把POD类型存储到文件中&#xff0c;并从文…

干货丨Linux终端常见用法总结(收藏)

一、前言 熟悉Linux终端的基础用法和常见技巧可以极大提高运维及开发人员的工作效率&#xff0c;笔者结合自身学习实践&#xff0c;总结以下终端用法供同行交流学习。 二、常见用法 1.快捷键 1.1.Alt. 在光标位置插入上一次执行命令的最后一个参数。 1.2.CtrlR 模糊搜索历…

jenkins gitlab CI/CD

jenkins的安装教程就不说了&#xff1a;Jenkins docker 一键发布 (一)_jenkins 一键发布-CSDN博客 最近打算从svn切换到gitlab&#xff0c;所以配置了一下jenkins的git 很简单&#xff0c;直接上图 1 选择 Git 2 录入gitlab的http地址&#xff08;由于我的git地址不是22端口&…

数据结构与算法之美代码:排序算法3

目录 算法原理桶排序 代码实现桶排序代码实现计数排序代码实现 算法原理 桶排序 核心思想是将要排序的数据分到几个有序的桶里&#xff0c;每个桶里的数据再单独进行排序。桶内排完序之后&#xff0c;再把每个桶里的数据按照顺序依次取出&#xff0c;组成的序列就是有序的了。…

【小白专用】PHP中的JSON转换操作指南 23.11.06

一、JSON的基础知识 1.1JSON数据格式 JSON数据格式是一组键值对的集合&#xff0c;通过逗号分隔。键值对由“键”和“值”组成&#xff0c;中间使用冒号分隔。JSON数据格式可以嵌套&#xff0c;而且可以使用数组 二、PHP中的JSON函数 JSON的操作需要使用编程语言进行处理&am…

接口测试及接口测试工具

首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给你…

【NI-DAQmx入门】外部采样时钟相关

1.时钟的作用 时钟在几乎所有测量系统中都起着至关重要的作用。通过硬件定时测量&#xff0c;时钟控制采样或更新的发生时间。与依赖软件计时测量相比&#xff0c;您可以选择硬件定时测量来实现采样或更新之间更一致的时间间隔。以数模转换器特性分析为例。该应用由三个基本部分…

阿里云安全恶意程序检测(速通一)

阿里云安全恶意程序检测 赛题理解赛题介绍赛题说明数据说明评测指标 赛题分析数据特征解题思路 数据探索数据特征类型数据分布箱型图 变量取值分布缺失值异常值分析训练集的tid特征标签分布测试集数据探索同上 数据集联合分析file_id分析API分析 特征工程与基线模型构造特征与特…

大厂面试题-innoDB如何解决幻读

从三个方面来回答&#xff1a; 1、Mysql的事务隔离级别 Mysql有四种事务隔离级别&#xff0c;这四种隔离级别代表当存在多个事务并发冲突时&#xff0c;可能出现的脏读、不可重复读、幻读的问题。 其中InnoDB在RR的隔离级别下&#xff0c;解决了幻读的问题。 2、什么是幻读&…

Java手动引入Maven依赖的Jar包

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…