重学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.mzph.cn/news/716596.shtml

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

相关文章

ERDAS监督分类与温度反演教程

本期带来监督分类教程,更多内容,欢迎关注小编的公众号梧桐凉月哦!!! 一、研究区自然、地理环境特征: 1、景德镇市位于中国江西省东北部,地处赣江中游的赣北盆地,地形地貌以丘陵和低…

mitmproxy代理

文章目录 mitmproxy1. 网络代理2. 安装3. Https请求3.1 启动mitmproxy3.2 获取证书3.3 配置代理3.4 运行测试 4. 请求4.1 读取请求4.2 修改请求4.3 拦截请求 5. 响应5.1 读取响应5.2 修改响应 6. 案例:共享账号6.1 登录bilibili获取cookies6.2 在代理请求中设置cook…

ER-NeRF实时对话数字人模型训练与部署

ER-NeRF是基于NeRF用于生成数字人的方法,可以达到实时生成的效果。 下载源码 cd D:\Projects\ git clone https://github.com/Fictionarry/ER-NeRF cd D:\Projects\ER-NeRF 下载模型 准备面部解析模型 wget https://github.com/YudongGuo/AD-NeRF/blob/master/…

MyBatisPlus入门教程

MyBatisPlus MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 官网地址:https://baomidou.com/ 一、入门案…

sql注入之sqli-labs-less-1 错误注入

输入?id1 得到登录页面: 通过order by 函数试探: 5的时候报错 试探到3 的时候返回正确的值: 然后继续注入:?id -1 union select 1,2,3 -- 查看回显点: 开始查看数据库内容:id-1 union select 1,databa…

open-spider开源爬虫工具:抖音数据采集

在当今信息爆炸的时代,网络爬虫作为一种自动化的数据收集工具,其重要性不言而喻。它能够帮助我们从互联网上高效地提取和处理数据,为数据分析、市场研究、内容监控等领域提供支持。抖音作为一个全球性的短视频平台,拥有海量的用户…

CKA考生注意:这些Deployment要点能助你一臂之力!

往期精彩文章 : 提升CKA考试胜算:一文带你全面了解RBAC权限控制!揭秘高效运维:如何用kubectl top命令实时监控K8s资源使用情况?CKA认证必备:掌握k8s网络策略的关键要点提高CKA认证成功率,CKA真题中的节点维…

68-解构赋值,迭代器,生成器函数

1.解构赋值(针对数组array&#xff0c;字符串String及对象object以) 结构赋值是一种特殊的语法&#xff0c;通过将各种结构中的元素复制到变量中达到"解构"的目的&#xff0c;但是数组本身没有改变 1.1解构单层数组 <script>let arr [1,2,3,4,5];//获取数组…

c++ primer学习笔记(一)

目录 第一章、c快速入门 重点&#xff1a;类的简介 第二章 1、基本内置类型 2、字面值常量 1、整型字面值规则 2、浮点字面值规则 3、布尔字面值 4、字符字面值 5、非打印字符的转义序列 ​编辑 6、字符串字面值 3、变量 1、变量标识符 2、定义和初始化对象 3、…

java: 无法访问org.springframework.web.bind.annotation.RequestMapping......类文件具有错误的版本 61.0, 应为 52.0

文章目录 一、报错问题二、问题背景三、原因分析四、解决方案 一、报错问题 java: 无法访问org.springframework.web.bind.annotation.RequestMapping 错误的类文件: /D:/SoftwareInstall/Maven/repository/org/springframework/spring-web/6.0.9/spring-web-6.0.9.jar!/org/s…

latex报错Repeated entry解决办法

报错原因——重复了两个参考文献&#xff0c;删掉一个即可 总结 "Repeated entry"这个错误通常出现在你尝试在LaTeX中多次使用同一个标签&#xff08;label&#xff09;或者多次插入相同的图像/表格等时。例如&#xff0c;在LaTeX中&#xff0c;我们可能会为每一个章…

Modern C++ std::any为何要求Tp可拷贝构造?

小问题也会影响设计的思路&#xff0c;某个问题或某种case的探讨有助于理解设计的初衷。 声明&#xff1a;以下_Tp/Tp都是指要放入std::any的对象的类型。 它要求_Tp is_copy_constructible, 仅仅是因为有很多函数的实现调用了Tp的拷贝构造函数吗&#xff1f;比如说上节提到的初…

动态SQL的处理

学习视频&#xff1a;3001 动态SQL中的元素_哔哩哔哩_bilibili 目录 1.1为什么学 1.2动态SQL中的元素 条件查询操作 if 元素 choose、when、otherwise元素 where、trim元素 更新操作 set元素使用场景 复杂查询操作 foreach 元素中的属性 ​编辑 迭代数组 迭代List 迭代Map 1…

第3部分 原理篇2去中心化数字身份标识符(DID)(4)

3.2.3. DID解析 3.2.3.1. DID解析参与方 图3-5 DID 解析过程 本聪老师&#xff1a;我们之前提到过&#xff0c;DID 解析过程是将 DID 转换为对应的 DID 文档。这样做的目的是验证 DID 所代表的主体的身份。那么解析过程会涉及哪些概念呢&#xff1f;我们看图3-&#xff0c;DI…

端智能:面向手机计算环境的端云协同AI技术创新

近年来&#xff0c;随着移动端设备软硬件能力的进步&#xff0c;移动端的算力有了很大提升&#xff0c;同时面向移动端的机器学习框架和模型轻量化技术越来越成熟&#xff0c;端上的AI能力逐渐进入大众视野&#xff0c;端智能在电商领域也开始逐步走向规模化应用。通过持续探索…

leetcode日记(35)跳跃游戏Ⅱ

想了一个晚上&#xff0c;第一个思路是用动态规划&#xff0c;记录走到每一个节点需要跳动的最小步数&#xff0c;大致方法是每走到一个节点就遍历一下前面的全部节点&#xff0c;看看哪个节点可以一部跳到该节点&#xff0c;然后从中选取跳跃步数最小的节点&#xff0c;最后输…

基于springboot+vue的城镇保障性住房管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

练习 3 Web [ACTF2020 新生赛]Upload

[ACTF2020 新生赛]Upload1 中间有上传文件的地方&#xff0c;试一下一句话木马 txt 不让传txt 另存为tlyjpg&#xff0c;木马文件上传成功 给出了存放目录&#xff1a; Upload Success! Look here~ ./uplo4d/06a9d80f64fded1e542a95e6d530c70a.jpg 下一步尝试改木马文件后缀…

从头构建gpt2 基于Transformer

从头构建gpt2 基于Transformer VX关注{晓理紫|小李子}&#xff0c;获取技术推送信息&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持&#xff01;&#xff01; 如果你感觉对你有所帮助&#xff0c;请关注我。 源码获取 VX关注晓理紫并回复“chatgpt…

CSS 自测题

盒模型的宽度计算 默认为标准盒模型 box-sizing:content-box; offsetWidth (内容宽度内边距 边框)&#xff0c;无外边距 答案 122px通过 box-sizing: border-box; 可切换为 IE盒模型 offsetWidth width 即 100px margin 纵向重叠 相邻元素的 margin-top 和 margin-bottom 会发…