重学Springboot3-@ConditionalOnXxx条件注解

在这里插入图片描述

重学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@ConditionalOnMissingBeanpublic JdbcTemplate jdbcTemplate(DataSource dataSource) {return new JdbcTemplate(dataSource);}
}

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

@Configuration
@ConditionalOnWebApplication
public class WebConfig {@Beanpublic 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 {@Overridepublic 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.hqwc.cn/news/505540.html

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

相关文章

对程序、进程、线程、并发、并行、高并发概念的讲解

一、概述 程序、进程、线程、并发、并行和高并发是计算机科学领域中非常重要的概念。 了解进程、线程、并发和并行的概念,可以更好地利用计算机的多核处理器和并行计算能力,提高计算机性能。 了解进程和线程为操作系统中的资源管理提供了基础&#xff…

每日一类:QLabel深入解析

QLabel是Qt中用于显示文本或图像的控件,属于Qt Widgets模块。它是展示静态内容的理想选择,支持富文本格式,使得文本可以包含不同的字体、颜色和链接。QLabel也可以用来显示图像,包括动态图像。此外,它还支持文本和图像…

P4715 【深基16.例1】淘汰赛题解

题目 有(n≤7)个国家参加世界杯决赛圈且进入淘汰赛环节。已经知道各个国家的能力值,且都不相等。能力值高的国家和能力值低的国家踢比赛时高者获胜。1号国家和2号国家踢一场比赛,胜者晋级。3号国家和4号国家也踢一场,…

实战 | 使用YOLOv8图像分割实现路面坑洞检测(步骤 + 代码)

导 读 本文主要介绍使用YOLOv8图像分割实现路面坑洞检测(步骤 代码)。 背 景 如上图所示,现实生活中路面坑洞对车辆和驾驶员安全来说存在巨大隐患,本文将介绍如何使用YoloV8图像分割技术来检测路面坑洞,从而提示驾…

平台工程: 用Backstage构建开发者门户 - 1

本文介绍了如何使用开源Backstage构建自己的开发者门户,并基于此实践平台工程。本系列共两篇文章,这是第一篇。原文: Platform Engineering: Building Your Developer Portal with Backstage — Part 1 在上一篇文章(平台工程与安全)中,我们介…

2023人机交互期末复习

考试题型及分值分布 1、选择题(10题、20分) 2、填空题(10题、20分) 3、判断题(可选、5题、10分) 4、解答题(5~6题、30分) 5、分析计算题(1~2题、20分) 注意&…

EI顶刊复现:基于氨储能技术的电转氨耦合风–光–火综合能源系统双层优化调度程序代码!

适用平台:MatlabYalmipCplex 程序首先提出电转氨耦合综合能源系统构型,并为燃煤机组出力、风光消纳和电转氨运行的经济性和稳定性的综合评价定义风–光–火–氨系统协调运行指标;进而构建以协调运行指标最大为上层目标、电转氨耦合风–光–火…

【每日一题】3.2 求逆序对

题目描述 给定一个长度为 n的整数数列&#xff0c;请你计算数列中的逆序对的数量。 逆序对的定义如下&#xff1a;对于数列的第 i个和第 j个元素&#xff0c;如果满足 i<j 且 a[i]>a[j]&#xff0c;则其为一个逆序对&#xff1b;否则不是。 输入格式 第一行包含整数 n…

基于 LLaMA 和 LangChain 实践本地 AI 知识库

有时候,我难免不由地感慨,真实的人类世界,本就是一个巨大的娱乐圈,即使是在英雄辈出的 IT 行业。数日前,Google 正式对外发布了 Gemini 1.5 Pro,一个建立在 Transformer 和 MoE 架构上的多模态模型。可惜,这个被 Google 寄予厚望的产品并未激起多少水花,因为就在同一天…

腾讯云优惠券领取入口_先领取再下单_2024腾讯云优惠攻略

腾讯云优惠代金券领取入口共三个渠道&#xff0c;腾讯云新用户和老用户均可领取8888元代金券&#xff0c;可用于云服务器等产品购买、续费和升级使用&#xff0c;阿腾云atengyun.com整理腾讯云优惠券&#xff08;代金券&#xff09;领取入口、代金券查询、优惠券兑换码使用方法…

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

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

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(十三)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型&#xff0c;由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”&#xff08;そら sora&#xff09;&#xff0c;即天空之意&#xff0c;以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…