当前位置: 首页 > news >正文

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&#xff0…...

婚恋交友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是一个典型的分布式数据一致性的解决方案&#xff0…...

首起针对国内金融企业的开源组件投毒攻击事件

简述 2023年8月9日,墨菲监控到用户名为 snugglejack_org (邮件地址:SnuggleBearrxxhotmail.com)的用户发布到 NPM 仓库中的 ws-paso-jssdk 组件包具有发向 https://ql.rustdesk[.]net 的可疑流量,经过确认该组件包携带远控脚本&a…...

源于传承,擎领未来,新架构、新工艺下的“换心工程”——金融电子化访中电金信副总经理、研究院院长况文川

当前,商业银行的经营环境正在发生着深刻而复杂的变化,在深化改革主旋律的指引下,数字化转型已成为我国商业银行普遍认同、广泛采用的战略性举措。核心系统作为承载银行业务的关键支柱系统,一直是各银行在金融科技建设中重点关注和…...

pytest数据驱动(最简单)

目录 第一种:通过yaml文件获取数据(一维列表) 第二种:通过yaml文件获取数据(二维列表) 第三种:通过yaml文件获取数据(pytest.fixture) 资料获取方法 第一种&#xff…...

分布式 - 服务器Nginx:一小时入门系列之代理缓冲与缓存

官方文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html 1. 代理缓冲 proxy_buffer 代理缓冲用于临时存储从后端服务器返回的响应数据。通过使用代理缓冲,Nginx可以在接收完整的响应后再将其发送给客户端,从而提高性能和效率…...

什么是集成学习算法

目录 什么是集成学习算法 集成学习发展史 集成学习组织方式 1) 并联组织关系...

springboot多模块打包方式

明确子父模块结构 父目录是带modules 大致结构如下&#xff1a; <modules><module>ruoyi-admin</module><module>ruoyi-framework</module><module>ruoyi-system</module><module>ruoyi-quartz</module><module>…...

【爬虫】Urllib让我们的 python 假装是浏览器

在 Python 这个内置的 Urllib 库中&#xff0c;有这么 4 个模块&#xff1a; request&#xff0c;request模块是我们用的比较多的&#xff0c;就是用它来发起请求&#xff0c;所以我们重点说说这个模块。error&#xff0c;error模块呢&#xff0c;就是当我们在使用 request 模…...

java基础面试

java深拷贝和浅拷贝的区别 深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体&#xff0c;而不是引用。 假设B复制了A&#xff0c;修改A的时候&#xff0c;看B是否发生变化&#xff1a; 如果B跟着也变了&#xff0c;说明是浅拷贝&#xff0c;拿人手短&#xff…...

C++ 动态规划经典案例解析之最长公共子序列(LCS)_窥探递归和动态规划的一致性

1. 前言 动态规划处理字符相关案例中&#xff0c;求最长公共子序列以及求最短编辑距离&#xff0c;算是经典中的经典案例。 讲解此类问题的算法在网上一抓应用一大把&#xff0c;即便如此&#xff0c;还是忍不住有写此文的想法。毕竟理解、看懂都不算是真正掌握&#xff0c;唯…...

接口测试自动化:简化测试流程,提升效率

接口测试自动化&#xff1a;简化测试流程&#xff0c;提升效率 什么是接口测试自动化&#xff1f; 接口测试自动化是指使用特定的工具和技术来自动化执行接口测试的过程。通过编写脚本&#xff0c;自动化工具可以模拟用户与软件系统的交互&#xff0c;验证接口的功能和性能。…...

LoRA微调方法详解

本文要介绍的是大模型的微调训练方法之一----LoRA。 0 背景 现在大模型非常火爆&#xff0c;大家都在想方设法应用大模型。 当前很多大模型虽说可以zero-shot直接使用&#xff0c; 但是在具体应用上一般还是微调一下效果更好&#xff0c; 也就是常说的finetune。 在小模型时代…...

redis-数据类型及样例

一.string 类型数据的基本操作 1.添加/修改数据 set key value2.获取数据 get key3.删除数据 del key4.添加/修改多个数据 mset key1 value1 key2 value25.获取多个数据 mget key1 key2二.list类型的基本操作 数据存储需求&#xff1a;存储多个数据&#xff0c;并对数据…...

公司电脑三维图纸加密、机械图挡加密软件

机械图纸加密软件的问世&#xff0c;让很多的网络公司都大受其带来的工作中的便利。在安装了机械图纸加密软件后&#xff0c;不仅可以很好的管理员工在工作时的上网娱乐&#xff0c;在对整个公司员工的工作效率上也有着明显的提高&#xff0c;那么对于机械图纸加密软件的具体特…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...