重学Springboot3-@ConditionalOnXxx条件注解

news2024/11/15 19:36:22

在这里插入图片描述

重学Springboot3-@ConditionalOnXxx条件注解

  • 引言
  • 常见的条件注解
  • 常见的条件注解示例
  • 扩展条件注解
    • 1. @ConditionalOnJndi
    • 2. @ConditionalOnJava
    • 3. @ConditionalOnCloudPlatform
    • 4. @ConditionalOnEnabledResourceChain
    • 5. 自定义条件注解
  • 总结

引言

Spring Boot 提供了一组强大的条件注解(形如 @ConditionalOnXxx),这些注解允许开发者根据特定的条件来控制配置类或者 bean 的创建。这种机制支持灵活的配置和自动配置,是 Spring Boot “约定优于配置”理念的体现。

常见的条件注解

以下是一些 Spring Boot 中常见的条件注解及其作用:

  • @ConditionalOnBean@ConditionalOnMissingBean:这两个注解控制一个 bean 的创建是否依赖于容器中是否存在另一个 bean。例如,只有当容器中存在 DataSource 类型的 bean 时,某个数据访问相关的 bean 才会被创建。

  • @ConditionalOnClass@ConditionalOnMissingClass:这些注解根据类路径上是否存在某个类来控制配置类或 bean 的创建。这对于基于可用依赖自动配置组件非常有用。

  • @ConditionalOnProperty:这个注解允许基于 Spring Environment 的属性值来控制 bean 的创建。例如,你可以根据某个特定的属性是否存在或值为何来决定是否创建一个 bean。

  • @ConditionalOnResource:当一个特定的资源存在于类路径上时,相关的配置或 beans 才会被创建。

  • @ConditionalOnWebApplication@ConditionalOnNotWebApplication:这两个注解基于应用是否是一个 web 应用来控制配置或 beans 的创建。

  • @ConditionalOnExpression:基于 SpEL 表达式的评估结果来控制 bean 的创建。

常见的条件注解示例

下面是一些使用 Spring Boot 条件注解的示例:

@Configuration
@ConditionalOnClass({DataSource.class, JdbcTemplate.class})
public class JdbcTemplateAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

在这个例子中,JdbcTemplateAutoConfiguration 配置类只有在 DataSourceJdbcTemplate 类都在类路径上时才会被激活。同时,jdbcTemplate bean 只有在缺失时才会被创建。

@Configuration
@ConditionalOnWebApplication
public class WebConfig {

    @Bean
    public User myUser() {
        return new User();
    }
}

在这个例子中,WebConfig 配置类只有在应用是一个 web 应用时才会生效。

@Bean
@ConditionalOnProperty(name = "user.show", havingValue = "true")
public User myUser1() {
    return new User();
}

这里,myUser1 只有在 application.properties 文件中设置了 use.my.bean=true 时才会被创建。

@Bean
@ConditionalOnExpression("#{environment['spring.profiles.active'] == 'dev' && systemProperties['user.country'] == 'CN'}")
public User myUser2() {
    return new User();
}

这里,myUser2 只在当前激活的 Spring 配置文件为 dev 且系统属性 user.country 设置为 CN 时创建。

扩展条件注解

还有一些不常用但可以帮助开发者根据不同的环境或条件灵活配置应用。下面是一些额外的条件注解及其用法:

1. @ConditionalOnJndi

@ConditionalOnJndi 注解可以控制配置或 beans 的创建,依赖于 JNDI (Java Naming and Directory Interface) 的存在。例如,只有当特定的 JNDI 资源可用时,某个 bean 才会被创建。

@Configuration
@ConditionalOnJndi("java:comp/env/jdbc/DataSource")
public class JndiDataConfig {
    // 配置类定义
}

这里,JndiDataConfig 配置类只有在名为 java:comp/env/jdbc/DataSourceJNDI 资源存在时才会生效。

2. @ConditionalOnJava

@ConditionalOnJava 控制配置或 bean 的创建,基于 Java 版本。这允许你编写只在特定版本的 Java 环境下才激活的配置。

@Configuration
@ConditionalOnJava(JavaVersion.EIGHT)
public class Java8Config {
    // 配置类定义
}

在这个例子中,Java8Config 配置类只有在 Java 8 环境中才会生效。

3. @ConditionalOnCloudPlatform

@ConditionalOnCloudPlatform 是 Spring Boot 2.2 引入的注解,用于根据应用运行的云平台环境来控制配置或 bean 的创建。例如,你可以基于应用是否在 AWS 或 Azure 上运行来进行不同的配置。

@Configuration
@ConditionalOnCloudPlatform(CloudPlatform.AWS)
public class AwsConfig {
    // 配置类定义
}

在这个例子中,AwsConfig 只在 AWS 环境下才会生效。

4. @ConditionalOnEnabledResourceChain

@ConditionalOnEnabledResourceChain 是 Spring Boot 中的一个条件注解,主要用于 Web 资源优化配置。它用于条件性地配置资源链(Resource Chain),以提高 Web 应用程序中静态资源(如 JavaScript、CSS 文件)的服务效率。

@Configuration
@ConditionalOnEnabledResourceChain
public class CustomResourceChainConfig {
    // 在这里定义资源链相关的 bean 或配置
}

只有当 application.propertiesapplication.yml 中的配置项 spring.resources.chain.enabled 被设置为 true 时,CustomResourceChainConfig 中的配置才会被注册和生效。

5. 自定义条件注解

除了使用 Spring Boot 提供的条件注解外,你还可以创建自己的条件注解。这通常涉及实现 Condition 接口,并使用 @Conditional 注解来应用它。这允许你定义非常具体和细粒度的条件逻辑。

public class OnSystemPropertyCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return "true".equals(System.getProperty("my.custom.property"));
    }
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Conditional(OnSystemPropertyCondition.class)
public @interface ConditionalOnSystemProperty {
    // 注解定义
}

使用这个自定义注解,你可以控制只有当系统属性 my.custom.property 设置为 true 时,相关的配置或 beans 才会被创建。

总结

Spring Boot 的条件注解提供了一种强大且灵活的方式来根据不同的条件动态地配置 Spring 应用。通过使用这些注解,开发者可以轻松实现基于条件的自动配置,这使得应用配置更加简洁和高效。掌握这些条件注解,将有助于你更好地理解和使用 Spring Boot 的自动配置功能。

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

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

相关文章

2.1 mov、add和sub加减指令实操体验

汇编语言 1. mov操作 1.1 mov移动值 mov指令把右边的值移动到左边 mount c d:masm c: debug r ax 0034 r 073f:0100 mov ax,7t1.2 mov移动寄存器的值 把右边寄存器的值赋值给左边的寄存器 a 073f:0105 mov bx,axt1.3 mov高八位(high)和低八位&am…

cetos7 Docker 安装 gitlab

一、gitlab 简单介绍和安装要求 官方文档:https://docs.gitlab.cn/jh/install/docker.html 1.1、gitlab 介绍 gitLab 是一个用于代码仓库管理系统的开源项目,使用git作为代码管理工具,并在此基础上搭建起来的Web服务平台,通过该平…

C++_数据类型_布尔类型

作用 布尔数据类型代表真或假的值 bool类型只有两个值: ture 真(本质是1)false 假 (本质是0) bool类型占1个字节大小 示例 注意 bool类型,只要是非0的值都代表真

【谈一谈】我们所用的三种工厂模式优缺点

【谈一谈】我们所用的三种工厂模式优缺点 Hello!!大家好啊,好久也没有进行文章的更新了,原因嘛,最近的工作任务量有点大,导致摸鱼充电的时间大量减少,哈哈哈(你别说,这是借口嘛!) 不过,今天是星期六,难的能够在这里分享下最近在工作中,我用到的三种工厂模式(简工抽),有啥区别呢…

国内哪个工具可以平替chatgpt?国内有哪些比较好用的大模型gpt?

我自己试用了很多的平台,发现三个比较好的大模型平台,对普通用户也比较的友好的,而且返回内容相对来说,正确率更高的,并且相关场景插件比较丰富的国内厂商。 本文说的,是我自己觉得的,比较有主观…

linux之进程理解(1)

目录 1. 冯诺依曼体系结构 2. 操作系统(OS) 2.1 概念 2.2 设计OS的目的 2.3 定位 2.4 理解管理 3. 系统调用和库函数概念 4. 补充 1. 冯诺依曼体系结构 我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体…

HCIA-Datacom实验指导手册:8 网络编程与自动化基础

HCIA-Datacom实验指导手册:8 网络编程与自动化基础 一、实验介绍:二、实验拓扑:三、实验目的:四、配置步骤:步骤 1 完成交换机的 Telnet 预配置步骤 2 Python 代码编写 五、结果验证六、windows 计划任务程序配置七、 …

全部都有的子序列

思路(双指针) 先使用Set来存储总共有多少不同的数字,然后我们使用快慢指针去遍历数组,快指针每次遍历到一个数,将其加入到哈希表,哈希表使用pair存储,第一个元素存数字,第二个元素存…

2024最新算法:鳑鲏鱼优化算法(Bitterling Fish Optimization,BFO)求解23个基准函数(提供MATLAB代码)

一、鳑鲏鱼优化算法 鳑鲏鱼优化算法(Bitterling Fish Optimization,BFO)由Lida Zareian 等人于2024年提出。鳑鲏鱼在交配中,雄性和雌性物种相互接近,然后将精子和卵子释放到水中,但这种方法有一个很大的缺…

javaweb请求与响应

前言 前面介绍了对应的服务器端的相关代码。这里开始学习服务器端与客户端的数据请求与响应 这里的仅仅是一个简单的调用,并没有经过servelert接口来进行调用,同前面的一样,我们介绍对应的本地服务器进行的部署项目。 代码 //属于简单的不…

【Memory协议栈】Memory Abstraction Interface模块介绍

目录 前言 正文 1.功能简介 2.关键概念 3.关键类型定义 3.1 MemIf_StatusType 3.2 MemIf_JobResultType 3.3 MemIf_ModeType 4.关键API定义 4.1 MemIf_SetMode 4.2 MemIf_Read 4.3 MemIf_Write 4.4 MemIf_Cancel 4.5 MemIf_GetStatus 4.6 MemIf_GetJobResult 4…

2023年NOC大赛软件创意编程(学而思)赛道图形化小高组复赛试题

目录 第一题 闪烁的星星 第二题 聚沙成塔 第三题 画十字

#WEB前端(DIV、SPAN)

1.实验&#xff1a;DIV、SPAN 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; 类? 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdev…

状态机设计原则系列之效率最大化

检测、搬运类设备,自动运行往往都设计状态机,搬运类对设备节拍往往要求很高,这里我们就需要合理的划分状态机了,使我们的执行效率最大化。有关状态机的系列文章可以查看下面相关文章链接: 1、机器流程控制之建立状态机 https://rxxw-control.blog.csdn.net/article/deta…

智能驾驶规划控制理论学习04-基于车辆运动学的规划方法

目录 一、线性二自由度汽车模型&#xff08;自行车模型&#xff09; 1、二自由度模型概述 2、不同参考点下的状态空间方程 3、前向仿真 二、运动基元生成方法 1、杜宾斯曲线&#xff08;Dubins Curve&#xff09; 2、Reeds Shepp Curve 三、多项式曲线&#xff08;Poly…

多线程(进阶四:线程安全的集合类)

目录 一、多线程环境使用ArrayList 二、多线程环境使用队列 三、多线程环境使用哈希表 1、HashMap 2、Hashtable 3、ConcurrentHashMap (1)缩小了锁的粒度 (2)充分使用了CAS原子操作&#xff0c;减少一些加锁 (3)针对扩容操作的一些优化&#xff08;化整为零&#xff…

优选算法|【双指针】283.移动零

题目 283. 移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12]输出: [1,3,12,0,0]示例 2: 输入…

基于ssm旅社客房收费管理系统+vue

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

PTA L2-005 集合相似度

给定两个整数集合&#xff0c;它们的相似度定义为&#xff1a;Nc​/Nt​100%。其中Nc​是两个集合都有的不相等整数的个数&#xff0c;Nt​是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。 输入格式&#xff1a; 输入第一行给出一个正整数N…

IEEE 802.1Qbv标准解析:为实时应用提供可靠网络基础设施

IEEE 802.1Qbv是IEEE 802.1家族中的一项重要标准&#xff0c;专门针对实时流量的时间敏感性进行优化。这一标准在网络通信领域&#xff0c;特别是在对实时性要求极高的应用中&#xff0c;如音视频传输、工业自动化、智能交通系统等&#xff0c;具有极其重要的地位。 在传统的以…