Springboot自动配置那些事

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,用一个工程不是更好吗,感觉牵强得很。

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

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

相关文章

链表(1)

目录 单链表 主函数test.c test1 test2 test3 test4 头文件&函数声明SList.h 函数实现SList.c 打印SLPrint 创建节点CreateNode 尾插SLPushBack 头插SLPushFront 头删SLPopBck 尾删SLPopFront 易错点 本篇开始链表学习。今天主要是单链表&OJ题目。 单链…

Gitlab服务器配置LDAP指导

ssh登录gitlab服务器:192.168.1.203修改配置文件 sudo su vim /etc/gitlab/gitlab.rb找到ldap_enabled和ldap_servers关键字并修改参数 保存配置文件并重新载入配置 gitlab-ctl reconfigure检查ldap相关配置是否成功(列出前100个用户,若没…

Redis 的几种集群对比

文章目录 一、对比分析二、优缺点对比三、总结 如果您对Redis的了解不够深入请关注本栏目,本栏目包括Redis安装,Redis配置文件说明,Redis命令和数据类型说明,Redis持久化配置,Redis主从复制和哨兵机制,Redi…

[动态规划] (三) LeetCode 746. 使用最小花费爬楼梯

[动态规划] (三)LeetCode 746. 使用最小花费爬楼梯(两种解法) 文章目录 [动态规划] (三)LeetCode 746. 使用最小花费爬楼梯(两种解法)题目解析解题思路状态表示状态转移方程初始化和填表顺序返回值状态表示状态转移方程初始化和填表顺序返回值 代码实现总结 746. 使用最小花费爬…

RK3568平台 内存的基本概念

一.Linux的Page Cache page cache,又称pcache,其中文名称为页高速缓冲存储器,简称页高缓。page cache的大小为一页,通常为4K。在linux读写文件时,它用于缓存文件的逻辑内容,从而加快对磁盘上映像和数据的访…

致:CSGO游戏搬砖人的一封信

最近大家还在坚持操作CSGO游戏搬砖项目不? 这个项目虽是稳赚项目,但也有行情好和行情不好的时候,平台的大中小各种活动的举办,都会对我们的项目造成一定影响。行情的上下波动势必然会影响卡价的波动,影响选品的快慢&a…

树专题 —— 二叉搜索树和中序遍历

大家好,我是 方圆。我准备把树写成一个专题,包括二叉搜索树、前序、中序、后序遍历以及红黑树,我也想试试能不能将红黑树写好。 本篇是关于二叉搜索树,也是所有后续学习的基础,其中会涉及前序、中序、后序遍历&#x…

自动驾驶学习笔记(六)——Apollo安装

#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《2023星火培训【感知专项营】》免费课程—>传送门 文章目录 前言 Apollo安装 硬件配置 安装Ubuntu…

代码随想录第四十四天 | 动态规划 完全背包:纯完全背包理论基础(卡码网第52题);应用(注意遍历顺序):组合(518),排列(377)

1、动态规划:完全背包理论基础 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大…

Mysql数据库 9.SQL语言 查询语句 连接查询、子查询

连接查询 通过查询多张表,用连接查询进行多表联合查询 关键字:inner join 内连接 left join 左连接 right join 右连接 数据准备 创建新的数据库:create database 数据库名; create database db_test2; 使用数据库:use 数据…

Day1 ARM基础

【ARM课程认知】 1.ARM课程的作用 承上启下 基础授课阶段:c语言、数据结构、linux嵌入式应用层课程:IO、进程线程、网络编程嵌入式底层课程:ARM体系结构、系统移植、linux设备驱动c/QT 2.ARM课程需要掌握的内容 自己能够实现简单的汇编编…

AI 绘画 | Stable Diffusion 图生图

图生图简介 Stable Diffusion 不仅可以文生图,还可以图生图。文生图就是完全用提示词文本去生成我们想要图片,但是很多时候会有词不达意的感觉。就像我们房子装修一样,我们只是通过文字描述很难表达出准确的想要的装修效果,如果能…

AD9371 官方例程裸机SW 和 HDL配置概述(二)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 : AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射: AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 : AD9371 官方…

stm32f103+HC-SR04+ssd1306实现超声波测距

🙌秋名山码民的主页 😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 获取源码,添加WX 目录 前言HC…

Python自动化测试(1)-自动化测试及基本技术手段概述

生产力概述 在如今以google为首的互联网时代,软件的开发和生产模式都已经发生了变化, 在《参与感》一书提到:某位从微软出来的工程师很困惑,微软在google还有facebook这些公司发展的时候,为何为感觉没法有效还击&…

Spring:常见的面试题和答案

1、什么是 Spring 框架?Spring 框架有哪些主要模块? Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。 Spring 帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。 Spring 框架…

【MogDB/openGauss的三种函数稳定性关键字】

一、ORACLE中的类似的函数稳定性关键字(DETERMINISTIC) 在ORACLE里,function有着一个DETERMINISTIC参数,它表示一个函数在输入不变的情况下输出是否确定,只要输入的参数一样,返回的结果一定一样的&#xf…

MS35657步进电机驱动器可兼容DRV8824

MS35657 是一款双通道 DMOS 全桥驱动器,可以驱动一个步进电机或者两个直流电机。可兼容DRV8824(功能基本一致,管脚不兼容)。每个全桥的驱动电流在 24V 电源下可以工作到 1.4A。MS35657 集成了固定关断时间的 PWM 电流校正器&#…

STM8单片机在医疗设备中的应用和优势

STM8单片机作为一种高性能、低功耗的微控制器,在医疗设备领域得到了广泛的应用。本文对STM8单片机在医疗设备中的应用进行了研究,探讨了它在医疗设备中的优势和特点,并分析了其在提升医疗设备性能、精确控制和数据处理等方面的应用效果。 一…

Arrays.asList() 和 List.of() 的列表之争

1. 概述 有时在Java中,为了方便,我们需要创建一个小列表或将数组转换为列表。Java 为此提供了一些辅助方法。 在本文中,我们将比较初始化小型临时数组的两种主要方法:List.of()和 Array.asList()。 2. Arrays.asList() Java 自…