SpringBoot 条件注解一览无余

文章目录

  • 条件注解是什么
  • 有哪些条件注解
    • 类条件注解
    • Bean条件注解
    • 属性条件注解
    • 资源条件注解
    • web应用条件注解
    • SpEL( Spring Expression Language )表达式条件注解
    • 其他条件注解
  • 总结

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

上篇文章我们在自定义starter中使用到了条件注解 @ConditionalOnMissingBean,那什么是条件注解呢?

条件注解是什么

条件注解是一种基于条件的注解,用于在应用程序中根据特定条件自动配置或排除某些组件。条件注解可以根据应用程序的环境、配置属性或其他条件来控制某些组件的注册和初始化。

有哪些条件注解

Springboot 提供了许多条件注解,主要分为7类:

类条件注解

类条件注解指的是根据指定的类来决定是否创建某个Bean的注解 ,这类注解有两个,分别为:

  • @ConditionalOnClass:当类路径上存在指定的类时,创建Bean。
  • @ConditionalOnMissingClass:当指定的类在类路径上不存在时,创建Bean

@ConditionalOnClass 注解具有以下属性:

  1. value :要检查的类的Class类型数组。当数组中的类型存在时,条件成立。
  2. name:与 value属性类似,指定要检查的类或接口的全限定名。当指定的类或接口存在时,条件成立。

@ConditionalOnMissingClass只有一个value属性,和@ConditionalOnClassvalue属性作用相反。

用法如下:

@AutoConfiguration
public class MyAutoConfiguration {@Bean@ConditionalOnMissingClass("com.example.MyClass")public SomeService someService() {return new SomeService();}
}

在上述示例中,通过@ConditionalOnMissingClass注解,当类com.example.MyClass不存在时,才会创建SomeService实例。

Bean条件注解

Bean条件注解指的是根据指定的Bean来决定是否创建某个Bean ,这类注解有两个,分别为:

  • @ConditionalOnBean: 当指定的 Bean 在容器中存在时,条件才会成立,创建某个Bean。
  • @ConditionalOnMissingBean:当容器中不存在指定类型的Bean时,创建某个Bean。

@ConditionalOnBean 注解具有以下属性:

  1. value:指定匹配的Bean 类型。可以使用单个Class对象作为值,或者使用一个Class数组来指定多个类。如果容器中存在其中任何一个 Bean,则条件满足。

  2. type:和value属性类似,不同的是value属性传的是Class类型数组, type传的是对应的全限定名或者类名。

  3. name:指定匹配的Bean 名称。可以使用单个 Bean 名称字符串,也可以使用一个名称字符串数组来指定多个 Bean 名称。如果容器中存在其中任何一个 Bean,则条件满足。

  4. parameterizedContainer:指定一个参数化类型的容器,在检查 Bean 是否存在时,会检查容器中是否存在泛型类型的实现类的 Bean。例如:@ConditionalOnBean(parameterizedContainer = List.class) 会检查容器中是否存在类型为 java.util.List 的 Bean。

  5. annotation:指定一个注解类型,在检查 Bean 是否存在时,会检查容器中是否存在被该注解标注的 Bean。

  6. match:指定匹配类型。默认为 MatchType.ALL,表示需要检查所有指定的 Bean 是否都存在。如果设置为 MatchType.ANY,则只要存在任何一个指定的 Bean,就可以满足条件。

其中valuename 二选一:valuename 两个属性是互斥的,只能选择其中一个来指定需要检查是否存在的 Bean。

@ConditionalOnMissingBean 注解除了有@ConditionalOnBean 注解所有的属性外,另外还多了两个属性:

  1. ignored:匹配时要忽略的Class类型数组
  2. ignoredType:匹配时要忽略的Class类型数组名称

用法如下:

@AutoConfiguration
public class MyAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic SomeService someService() {return new SomeService();}
}

在这段代码示例中,如果Spring容器中不包含 SomeServiceBean实例,ApplicationContext应用上下文才会创建名为 someServiceBean

属性条件注解

属性条件注解指的是根据配置属性的值来决定是否创建某个Bean的注解 ,这类注解只有一个:

  • @ConditionalOnProperty:当配置文件中指定属性存在或不存在时,创建某个Bean。

@ConditionalOnProperty 注解有以下属性:

  1. name:要匹配的属性的名称(必填属性),字符串数组,可以指定多个属性。通常是读取 application.propertiesapplication.yml 文件中的属性值。
  2. havingValue:要检查的属性的期望值,如果要检查的属性的值与该值相等,则条件成立(可选属性,默认为 “”)。
  3. matchIfMissing:要检查的属性不存在时是否也要认为条件成立(可选属性,默认为 false)。
  4. prefix:要检查的属性的前缀,即只有以指定前缀开头的属性才会被检查(可选属性,默认为空字符串)。
  5. value:要检查的属性的值,可以用来代替 namehavingValue 属性(可选属性,默认为空字符串数组), value可以同时指定多个要检查的属性的值,如果其中任意一个要检查的属性的值与期望值相等,则条件成立。

用法如下:

@ConditionalOnProperty(prefix = "spring", name = {"example.value"} , matchIfMissing = true , havingValue = "suncodernote")
class ExampleAutoConfiguration {
}

上面的示例的意思是,在启动时检查配置文件中前缀为spring,名称为 example.value的属性名,并且该属性的值是否是suncodernote ,即使没有匹配成功也可以加载类。

资源条件注解

资源条件注解指的是根据是否包含指定资源来决定是否创建某个Bean的注解 ,这类注解只有下面一个:

  • @ConditionalOnResource:根据类路径上是否存在指定资源文件来决定是否创建某个Bean。

@ConditionalOnResource 注解只有一个属性:

  • resources:指定需要检查的资源路径(必填),可以是相对于类路径的相对路径或绝对路径。

用法如下:

@ConditionalOnResource(resources = {"file:D:\\javassist-3.29.2-GA.jar" , "application.yml"})
class ExampleAutoConfiguration {
}

上面的示例的意思是,在启动时检查D盘是否有javassist-3.29.2-GA.jarclasspath下是否有application.yml,有的话就创建类。

web应用条件注解

web应用条件注解包括以下4个注解:

  • @ConditionalOnWebApplication: 当应用程序是一个 Web 应用程序时,会创建某个Bean。
  • @ConditionalOnNotWebApplication:当应用程序不是一个 Web 应用程序时,会创建某个Bean。
  • @ConditionalOnWarDeployment:当应用程序以war包的形式部署时,会创建某个Bean。使用内嵌服务器时,会返回false,也就是不会创建某个Bean。
  • @ConditionalOnNotWarDeployment:当应用程序不以war包的形式部署时,会创建某个Bean。

上面4个注解中只有@ConditionalOnWebApplication有属性,并且只有一个属性:

  • type:web应用程序类型,有ANYSERVLETREACTIVE3个值可选,默认为ANY

SpEL( Spring Expression Language )表达式条件注解

SpEL表达式条件注解只有一个注解,那就是@ConditionalOnExpression,它表示当指定的 SpEL 表达式结果为 true 时,条件才会成立。

@ConditionalOnExpression只有一个属性:

  • value:SpEL表达式,默认值true。如果条件满足,表达式应该返回true,否则返回false。

其他条件注解

除了以上这些注解外,还有一些其他的条件注解,这些注解都在 org.springframework.boot.autoconfigure.condition 包下
springboot 3.2

  1. @ConditionalOnJava:判断当前运行的JVM版本是否符合指定的版本要求,当JVM版本为指定的版本范围时,将会触发实例化。

  2. @ConditionalOnCheckpointRestore:用于指示一个配置类只在基于检查点的恢复可用时才会被加载。SpringBoot 在启动时检查是否启用了基于检查点的恢复。如果启用了基于检查点的恢复,那么带有该注解的配置类将会被加载并应用。否则,该配置类将不会被加载。在分布式系统中,检查点(Checkpoint) 是一种保存系统状态的方法,以便在系统故障或失败时可以恢复到之前的状态。

  3. @ConditionalOnCloudPlatform:只有在指定的云平台运行程序时才会加载指定的Bean。

  4. @ConditionalOnJndi:只有在 JNDI(Java Naming and Directory Interface) 存在的情况下,才会加载指定的 Bean。

  5. @ConditionalOnSingleCandidate:当使用@ConditionalOnSingleCandidate注解标记一个Bean时,它会根据容器中是否存在指定类型的Bean来决定是否注册这个Bean。如果在容器中存在且只存在一个指定类型的Bean,则被@ConditionalOnSingleCandidate注解标记的Bean将会被注册;如果不存在或存在多个指定类型Bean,则不会注册该Bean。这个注解在一些情况下非常有用,例如在多个实现类中选择一个默认的实现类,或者在只有一个数据源时配置默认的数据源等。通过使用@ConditionalOnSingleCandidate注解,可以避免歧义性的自动装配问题,并确保只有在特定条件下才注册相关的Bean。

  6. @ConditionalOnThreading:SpringBoot 3.2新增的一个注解,只有在使用特定类型的线程时创建 Bean。 特定类型的线程包括平台线程和虚拟线程。

总结

通过使用条件注解,可以轻松地根据应用程序的需求自定义配置。通常情况下,SpringBoot提供的条件注解已经足够使用,如果不满足的话我们可以自定义一个条件注解,下篇文章将介绍一下如何自定义一个条件注解。

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

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

相关文章

Java中的控制语句

控制语句包括3类:选择语句(if语句,switch语句),循环语句(for循环,while循,do..while..循环),转向语句(break,continue,ret…

四、通信和网络安全—网络通信模型(CISSP)

目录 1.OSI七层参照模型 2.OSI七层模型与TCP/IP网络模型的关系 2.1 网络层(Application Layer)

Flutter使用问题整理

前言 写这篇文章是为了记录平时在使用flutter时遇到的问题,及解决方案,方便再次遇到时能够快速解决。 问题及解决 问题1 真机运行项目,在构建时提示 Running Gradle task assembleDebug... 41.8s [!] App r…

OpenCV中inRange函数

在OpenCV中,inRange函数用于根据颜色范围从图像中提取特定的颜色区域。这个函数检查输入图像中的每个像素,如果像素值位于指定的范围内,则在输出图像(或掩码)中对应位置的像素被设置为白色(或者说是255&…

基于STM32的光照检测系统设计

基于STM32的光照检测系统设计 摘要: 随着物联网和智能家居的快速发展,光照检测系统在智能环境控制中扮演着越来越重要的角色。本文设计了一种基于STM32的光照检测系统,该系统能够实时检测环境光强度,并根据光强度调节照明设备,实现智能照明控制。本文首先介绍了系统的总体…

消息队列-RabbitMQ:MQ作用分类、RabbitMQ核心概念及消息生产消费调试

1、MQ 的相关概念 1)什么是 MQ MQ (message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互…

Delphi v11 安卓权限申请

问题 Delphi 10.4 的安卓权限申请代码&#xff0c;在 Delphi 11 下面编译无法通过。 原因 原因是里面有几个变量类型的定义有所不同。 procedure TDmBLE.RequestPermissionsResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TAr…

基于python+django+vue.js开发的医院门诊管理系统/医疗管理系统

功能介绍 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 功能包括&#xff1a;医生管理、科室管理、护士管理、住院管理、药品管理、用户管理、日志管理、系统信息模块。 源码地址 https://github.com/geeeeeee…

Vue报错,xxx is defined #变量未定义

vue.js:5129 [Vue warn]: Error in v-on handler: "ReferenceError: count is not defined" 浏览器将这个变量 当做全局变量了&#xff0c;事实上它只是实例中的变量 加上this指定&#xff0c;是vue实例中的变量

Itext生成pdf文件,html转pdf时中文一直显示不出来

之前使用freemark模板渲染ftl页面,转出的pdf中&#xff0c;css2有些样式好像不支持&#xff0c;比较常用的居中样式都没有效果&#xff0c;text-align:center 改造成使用html页面来转pdf&#xff0c;css2的样式可以生效,itext是不支持css3的弹性布局的ITextRenderer pdfRendere…

AI之Sora:Sora(文本指令生成视频的里程碑模型)的简介(能力/安全性/技术细节)、使用方法、案例应用之详细攻略

AI之Sora&#xff1a;Sora(文本指令生成视频的里程碑模型)的简介(能力/安全性/技术细节)、使用方法、案例应用之详细攻略 导读&#xff1a;Sora 是OpenAI研发的一个可以根据文字描述生成视频的AI模型。它的主要特性、功能以及OpenAI在安全和应用方面的策略的核心要点如下所示&a…

分布式锁的应用场景及实现

文章目录 分布式锁的应用场景及实现1. 应用场景2. 分布式锁原理3. 分布式锁的实现3.1 基于数据库 分布式锁的应用场景及实现 1. 应用场景 电商网站在进行秒杀、特价等大促活动时&#xff0c;面临访问量激增和高并发的挑战。由于活动商品通常是有限库存的&#xff0c;为了避免…

MySQL 基础知识(十)之 MySQL 架构

目录 1 MySQL 架构说明 2 连接层 3 核心业务层 3.1 查询缓存 3.2 解析器 3.3 优化器 3.4 执行器 4 存储引擎层 5 参考文档 1 MySQL 架构说明 下图是 MySQL 5.7 及其之前版本的逻辑架构示意图 MySQL 架构大致可分为以下三层&#xff1a; 连接层&#xff1a;负责跟客户…

[oeasy]python0007_ print函数_字符串_display_电传打字机_程序员的浪漫

你好世界 &#x1f94a; 回忆上次内容 上次 想输出 Hello world&#xff01;据说是程序猿的浪漫 键盘按键作用↑上一条指令↓下一条指令←光标 向左移动 一格→光标 向右移动 一格ctrl a光标 移动到开头ctrl e光标 移动到结尾 了解到 字符串 就是 给一串字符 两边加引号…

CAPL入门到精通之CAPL Functions(六) 时间管理函数

文章目录 Genreal Functions & Event ProceduresGeneral FunctionsTime ManagementaddTimeToMeasurementStartTime函数描述函数语法ParametersReturn ValuesExamplecancelTimer函数描述函数语法Parameters

19. 【Linux教程】nano 编辑器

前面小节介绍了如何使用 vim 编辑器&#xff0c;相比于 vim 编辑器&#xff0c;nano 编辑器就比较简单了。nano 是 UNIX 系统中的一个文本编辑器&#xff0c;大部分 Linux 发行版本默认都安装了 nano 文本编辑器。 和 vim 编辑器相比&#xff0c;nano 编辑器就没有那么强大&am…

学习文档:QT QTreeWidget及其代理

学习文档&#xff1a;QT QTreeWidget及其代理 1. QT QTreeWidget简介 QT QTreeWidget是QT框架中的一个重要组件&#xff0c;用于显示树形数据结构。它提供了一种方便的方式来展示并操作带有层次关系的数据。QTreeWidget可以显示包含多个列的树形视图&#xff0c;每个项目可以…

2024.2.19 阿里云Flink

一 、Flink基本介绍 Spark底层是微批处理 , Flink底层则是实时流计算 流式计算特点: 数据是源源不断产生,两大问题,乱序和延迟 Stateful:有状态 Flink的三个部分 Source:Transactions , logs ,iot ,clicks Transformation: 事件驱动 , ETL , 批处理 Sink : 输出 HDFS ,Kaf…

基于Spring Boot的多级缓存系统设计

在构建大规模应用时&#xff0c;缓存系统是提高性能的关键因素之一。为了更有效地利用缓存&#xff0c;我们可以设计一个基于Spring Boot的多级缓存系统&#xff0c;结合本地内存缓存&#xff08;如Caffeine&#xff09;和分布式缓存&#xff08;如Redis&#xff09;。以下是一…

Keil软件生成bin文件

首先需要在keil的魔法棒里将运行脚本加上 加上脚本后&#xff0c;还需要将编译后的文件存放于什么位置 C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o "$LL.bin" "#L" 到这里就可以了