24、springboot的自动配置01--类条件注解@ConditionalOnClass、bean条件注解@ConditionalOnBean
springboot的自动配置
★ 自动配置
Spring Boot的自动配置通常可根据依赖库自动触发——当Spring Boot检测到项目中包含某些框架的JAR包时,Spring Boot就会触发自动配置。其实通过@EnableAutoConfiguration注解来启动▲ 其实你用到@SpringBootApplication,该注解其实就组合了@EnableAutoConfiguration注解。因此应用主类只要使用@SpringBootApplication注解,就相当于添加@EnableAutoConfiguration注解。
★ 自动配置的替换原则
Spring Boot会为我们自动配置很多Bean——这些Bean就是整合某个框架所需要的基础Bean。举例来说,以整合MyBatis为例,典型至少需要DataSource、SqlSessionFactory、SqlSessionTemplate……如果不用Spring Boot,开发者就需要自行在容器中配置这些基础Bean来完成整合。用了Spring Boot之后,这些完成整合的基础Bean就交给Spring Boot来自动配置了。▲ 两种常见的替换原则:A. 一旦你在容器中配置了某种类型的(DataSource)的Bean,Spring Boot将不再自动配置该类型的Bean。这意味着开发者定制配置替换了Spring Boot的自动配置。 —这种是基于类型的替换原则。基于注解: @ConditionalOnMissingBean({DataSource.class})B. 一旦你在容器中配置了某个特定Id的(sqlSessionTemplate)的Bean,Spring Boot将不再自动配置该ID的Bean。这意味着开发者定制配置替换了Spring Boot的自动配置。——这种是基于ID的替换原则。基于注解:@ConditionalOnMissingBean(name = "sqlSessionTemplate")▲ 当开发者要替换Spring Boot的自动配置时,通常只要做一件事情——在Spring容器中添加自定义的配置,一旦你添加了自定义配置,Spring Boot自动配置就自动“退场”了。
★ 禁用自动配置
只要你使用了@EnableAutoConfigation注解,Spring Boot会自动启用所有XxxAutoConfiguration自动配置类。而XxxAutoConfiguration就是一个配置类(通常它带有@Configuration注解修饰),默认Spring Boot会扫描并加载它们【备注】:Spring Boot官方的自动配置类通常都位于spring-boot-autoconfigure.jar包中。▲ 禁用某个自动配置类:通过@EnableAutoConfiguration注解的如下属性来指定:- exclude:该属性值可以是一个Class数组,用于禁用一个或多个自动配置类。- excludeName:与前一个属性的作用基本相同,只不过此处指定一个或者多个自动配置类的完整类名的字符串形式。(就是全限定类名的形式)例子:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})——禁用DataSourceAutoConfiguration.class自动配置类。在application.properties文件中通过spring.autoconfigure.exclude例子:
spring.autoconfigure.exclude=\org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration▲ 自动配置和定制配置自动配置确实非常简单,所以Spring Boot上手很简单但Spring Boot自动配置只能处理那些最通用的情况,实际项目往往都需要定制配置,因此你必须掌握Spring Boot定制配置的原理,并能用定制配置去替换自动配置。
★ 自动配置的本质
就是由自动配置类提前配置了整合某个框架所需的基础Bean。——如果你不用Spring Boot,那么整合框架所需的这些基础Bean应该由开发者来配置。用了Spring Boot之后,这些Bean就交给Spring Boot的自动配置类来配置,开发者就无需手动配置,比较简单。
=========================================================
springboot最核心的就是条件注解,真正属于springboot的注解。
而之前的那些 @Controller、@RestController、@PathVariable @Bean 这些其实不属于springboot本身,其实是属于spring mvc,都是属于spring的框架本身
条件注解分类:
类条件注解:
@ConditionalOnClass、
@ConditionalOnMissingClass
Bean条件注解:
@ConditionalOnMissingBean、
@ConditionalOnSingleCandidate
@ConditionalOnBean
@ConditionalOnMissingFilterBean
属性条件注解:@ConditionalOnProperty
资源条件注解:@ConditionalOnResource
Web应用条件注解:
@ConditionalOnWebApplication.
@ConditionalOnNotWebApplication.
@ConditionalOnWarDeployment
SpEL表达式条件注解:
@ConditionalOnExpression
特殊条件注解:
@ConditionalOnCloudPlatform、
@ConditionalOnJava、
@ConditionalOnJndi.
@ConditionalOnRepositorylype

★ 类条件注解
类条件有两个@ConditionalOnClass、@ConditionalOnMissingClass,
分别表示某些类存在或不存在时被修饰的配置类或被修饰的配置方法生效。@ConditionalOnClass:表示某些类【存在】时被修饰的配置类或被修饰的配置方法生效。
@ConditionalOnMissingClass表示某些类【不存在】时被修饰的配置类或被修饰的配置方法生效。@ConditionalOnClass注解可通过value或name属性指定它所要求存在的类。@ConditionalOnMissingClass则只能通过value属性指定它所要求不存在的类。
代码演示 类条件注解 中的 @ConditionalOnClass
@ConditionalOnClass:表示某些类【存在】时被修饰的配置类或被修饰的配置方法生效。
演示使用注解 @ConditionalOnClass ,表示这个被这个注解修饰的类,得注解限制的一些东西存在,该类才能生效。
比如这个被 @ConditionalOnClass 注解修饰的类,
通过@ConditionalOnClass(name = “com.mysql.cj.jdbc.Driver”) 修饰,就是要求当前项目中存在 MYSQL 驱动时,这个配置类才会生效。

得有这个mysql的驱动,在启动类中获取这个配置类bean才能生效。

如图,有了@ConditionalOnClass(name = “com.mysql.cj.jdbc.Driver”)声明的mysql驱动,就可以在成功获取这个MyConfig01配置类这个bean(这个配置类在启动的时候会被加载成bean)
MyConfig01类贴了@ConditionalOnClass(name = “com.mysql.cj.jdbc.Driver”),如果没有mysql驱动,那么如图

★ Bean条件注解
@ConditionalOnBean:特定Bean存在时条件生效。
@ConditionalOnMissingBean:特定Bean不存在时条件生效。
@ConditionalOnSingleCandidate:特定Bean存在且唯一时条件生效。
@ConditionalOnMissingFilterBean:专门用于检查Filter。- 如果指定了name属性,表明根据Bean ID进行检查;否则根据Bean类型进行检查。【注意】:使用Bean条件注解时,务必要注意Bean的加载顺序。换而言之,你要检查某个Bean是否存在时,一定要保证你的该条件注解的执行时机在你检查的bean之后。
示例:
@ConditionalOnBean(name = "abc") ——当容器中有ID为abc的Bean时,下面的配置才生效。可能出现的情况时,虽然容器中已经配置了ID为abc的Bean,但由于abc 这个 Bean的加载时机较晚,晚于@ConditionalOnBean这个条件注解的加载时机,因此同样可能导致该条件失效。
▲ 控制顺序的注解:
@AutoConfigureBefore:只能修饰自动配置类,要求被修饰的配置类必须在指定配置类之前生效。@AutoConfigureAfter:只能修饰自动配置类,要求被修饰的配置类必须在指定配置类之后生效。@AutoConfigureOrder:可修饰配置类、方法、成员变量,指定一个自动配置顺序编号。编号越小的越先加载这3个注解主要用于控制自动配置类之间的顺序,对类内部的配置方法的顺序一般不做控制。@AutoConfigureOrder 官方说是能控制配置类、方法、成员变量的加载顺序,但其实只能控制类层面的加载顺序,如果要控制一个类中的多个方法的加载顺序,是没有效果的。
代码演示 Bean条件注解 @ConditionalOnBean
@ConditionalOnBean:特定Bean存在时条件生效。
创建一个userService 接口,然后把这个接口用@Bean 注解修饰为容器中的bean。
然后用@ConditionalOnBean(name = “getDataFormat”)修饰bean方法。
可以看出因为有 getDataFormat 这个bean,所以 userService 这个bean方法才能生效。

如果把两个bean的顺序反过来,就会因为加载时机的问题,导致出问题。
如图:我们把userService方法写在getDataFormat方法前面,那么项目在启动加载的时候,就会先加载userService方法,但是userService方法要生效的前提是有getDataFormat这个bean,但是此时的getDataFormat 方法加载时机比较慢,虽然代码写了,但是因为还没加载,在@ConditionalOnBean(name = “getDataFormat”) 看来就是没有getDataFormat这个bean,所以userService方法不生效,所以在启动类那边,ctx.getBean(“userService”),就找不到userService这个bean。

演示控制顺序的注解 @AutoConfigureOrder
@AutoConfigureOrder:可修饰配置类、方法、成员变量,指定一个自动配置顺序编号。编号越小的越先加载
这3个注解主要用于控制自动配置类之间的顺序,对类内部的配置方法的顺序一般不做控制。
@AutoConfigureOrder 官方说是能控制配置类、方法、成员变量的加载顺序,但其实只能控制类层面的加载顺序,如果要控制一个类中的多个方法的加载顺序,是没有效果的。
如图:即使加了注解,但是这个注解修饰方法,并没有效果,说是只有修饰类有效果

如图:还是得让getDataFormat方法先执行靠谱。

相关文章:
24、springboot的自动配置01--类条件注解@ConditionalOnClass、bean条件注解@ConditionalOnBean
springboot的自动配置 ★ 自动配置 Spring Boot的自动配置通常可根据依赖库自动触发——当Spring Boot检测到项目中包含某些框架的JAR包时,Spring Boot就会触发自动配置。其实通过EnableAutoConfiguration注解来启动▲ 其实你用到SpringBootApplication࿰…...
婚恋交友h5多端小程序开源版开发
婚恋交友h5多端小程序开源版开发 以下是婚恋交友H5多端小程序的功能列表: 用户注册和登录:用户可以通过手机号码或第三方账号注册和登录。个人信息填写:用户可以填写个人基本信息,包括姓名、性别、年龄、身高、体重、学历、职业等…...
uniapp案例30余种实战项目
uniapp案例30余种实战项目 mpvue框架仿滴滴出行didi-masteruni-app自定义导航栏title-customvue-mpvue-ChatRobot聊天机器人vue-mpvue-ChatRobot-master一款播课类小程序, 基于 mpvue 构建mp-podcast-mpvue-mastermpVue高仿美团小程序教程mpvue-meituan-masteruni-app 二维码生…...
回归预测 | MATLAB实现GRNN广义回归神经网络多输入多输出预测
回归预测 | MATLAB实现GRNN广义回归神经网络多输入多输出预测 目录 回归预测 | MATLAB实现GRNN广义回归神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 MATLAB实现GRNN广义回归神经网络多输入多输出预测,输入10个特征&#x…...
从零开始学习VBA(一)
前置配置设置 首先配置开发设置(不同版本的配置方法会有差异,可根据自己使用的EXCEL版本到网络上找对应的方法,比如直接搜索Excel2010 开发工具) 以下为excel2016配置方法: 操作路径:文件-选项-自定义功…...
Kotlin Executors线程池newSingleThreadExecutor单线程
Kotlin Executors线程池newSingleThreadExecutor单线程 import java.util.concurrent.Executorsfun main() {val mExecutorService Executors.newSingleThreadExecutor()for (i in 1..5) {mExecutorService.execute {println("seq-$i tid:${Thread.currentThread().threa…...
ZooKeeper介绍
ZooKeeper是一个开放源代码的分布式协调服务。ZooKeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。 ZooKeeper是一个典型的分布式数据一致性的解决方案࿰…...
首起针对国内金融企业的开源组件投毒攻击事件
简述 2023年8月9日,墨菲监控到用户名为 snugglejack_org (邮件地址:SnuggleBearrxxhotmail.com)的用户发布到 NPM 仓库中的 ws-paso-jssdk 组件包具有发向 https://ql.rustdesk[.]net 的可疑流量,经过确认该组件包携带远控脚本&a…...
源于传承,擎领未来,新架构、新工艺下的“换心工程”——金融电子化访中电金信副总经理、研究院院长况文川
当前,商业银行的经营环境正在发生着深刻而复杂的变化,在深化改革主旋律的指引下,数字化转型已成为我国商业银行普遍认同、广泛采用的战略性举措。核心系统作为承载银行业务的关键支柱系统,一直是各银行在金融科技建设中重点关注和…...
pytest数据驱动(最简单)
目录 第一种:通过yaml文件获取数据(一维列表) 第二种:通过yaml文件获取数据(二维列表) 第三种:通过yaml文件获取数据(pytest.fixture) 资料获取方法 第一种ÿ…...
分布式 - 服务器Nginx:一小时入门系列之代理缓冲与缓存
官方文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html 1. 代理缓冲 proxy_buffer 代理缓冲用于临时存储从后端服务器返回的响应数据。通过使用代理缓冲,Nginx可以在接收完整的响应后再将其发送给客户端,从而提高性能和效率…...
什么是集成学习算法
目录 什么是集成学习算法 集成学习发展史 集成学习组织方式 1) 并联组织关系...
springboot多模块打包方式
明确子父模块结构 父目录是带modules 大致结构如下: <modules><module>ruoyi-admin</module><module>ruoyi-framework</module><module>ruoyi-system</module><module>ruoyi-quartz</module><module>…...
【爬虫】Urllib让我们的 python 假装是浏览器
在 Python 这个内置的 Urllib 库中,有这么 4 个模块: request,request模块是我们用的比较多的,就是用它来发起请求,所以我们重点说说这个模块。error,error模块呢,就是当我们在使用 request 模…...
java基础面试
java深拷贝和浅拷贝的区别 深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。 假设B复制了A,修改A的时候,看B是否发生变化: 如果B跟着也变了,说明是浅拷贝,拿人手短ÿ…...
C++ 动态规划经典案例解析之最长公共子序列(LCS)_窥探递归和动态规划的一致性
1. 前言 动态规划处理字符相关案例中,求最长公共子序列以及求最短编辑距离,算是经典中的经典案例。 讲解此类问题的算法在网上一抓应用一大把,即便如此,还是忍不住有写此文的想法。毕竟理解、看懂都不算是真正掌握,唯…...
接口测试自动化:简化测试流程,提升效率
接口测试自动化:简化测试流程,提升效率 什么是接口测试自动化? 接口测试自动化是指使用特定的工具和技术来自动化执行接口测试的过程。通过编写脚本,自动化工具可以模拟用户与软件系统的交互,验证接口的功能和性能。…...
LoRA微调方法详解
本文要介绍的是大模型的微调训练方法之一----LoRA。 0 背景 现在大模型非常火爆,大家都在想方设法应用大模型。 当前很多大模型虽说可以zero-shot直接使用, 但是在具体应用上一般还是微调一下效果更好, 也就是常说的finetune。 在小模型时代…...
redis-数据类型及样例
一.string 类型数据的基本操作 1.添加/修改数据 set key value2.获取数据 get key3.删除数据 del key4.添加/修改多个数据 mset key1 value1 key2 value25.获取多个数据 mget key1 key2二.list类型的基本操作 数据存储需求:存储多个数据,并对数据…...
公司电脑三维图纸加密、机械图挡加密软件
机械图纸加密软件的问世,让很多的网络公司都大受其带来的工作中的便利。在安装了机械图纸加密软件后,不仅可以很好的管理员工在工作时的上网娱乐,在对整个公司员工的工作效率上也有着明显的提高,那么对于机械图纸加密软件的具体特…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...
