重学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
    @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 的自动配置功能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AutoEncoder和 Denoising AutoEncoder学习笔记

参考: 【1】 https://lilianweng.github.io/posts/2018-08-12-vae/ 写在前面: 只是直觉上的认识,并没有数学推导。后面会写一篇(抄)大一统文章(概率角度理解为什么AE要选择MSE Loss) TOC 1 Au…

Python解释器及PyCharm安装教程

PyCharm官方下载地址☞https://www.jetbrains.com/pycharm/download/?sectionwindows Python解释器官方下载地址☞ https://www.python.org/downloads/windows/

实践航拍小目标检测,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建无人机航拍场景下的小目标检测识别分析系统

关于无人机相关的场景在我们之前的博文也有一些比较早期的实践,感兴趣的话可以自行移步阅读即可: 《deepLabV3Plus实现无人机航拍目标分割识别系统》 《基于目标检测的无人机航拍场景下小目标检测实践》 《助力环保河道水质监测,基于yolov…

【C++】十大排序算法之 冒泡排序 选择排序

本次介绍内容参考自:十大经典排序算法(C实现) - fengMisaka - 博客园 (cnblogs.com) 排序算法是《数据结构与算法》中最基本的算法之一。 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序…

Golang 调度器 GPM模型

Golang 调度器 GPM模型 1 多进程/线程时代有了调度器需求 在多进程/多线程的操作系统中,就解决了阻塞的问题,因为一个进程阻塞cpu可以立刻切换到其他进程中去执行,而且调度cpu的算法可以保证在运行的进程都可以被分配到cpu的运行时间片。这…

腾讯云幻兽帕鲁服务器使用Linux和Windows操作系统,对用户的技术要求有何不同?

腾讯云幻兽帕鲁服务器使用Linux和Windows操作系统对用户的技术要求有何不同? 首先,从操作界面的角度来看,Windows操作系统相对简单易操作,适合那些偏好使用图形化界面操作的用户。而Linux操作系统则需要通过命令行完成&#xff0…

网络爬虫部分应掌握的重要知识点

目录 一、预备知识1、Web基本工作原理2、网络爬虫的Robots协议 二、爬取网页1、请求服务器并获取网页2、查看服务器端响应的状态码3、输出网页内容 三、使用BeautifulSoup定位网页元素1、首先需要导入BeautifulSoup库2、使用find/find_all函数查找所需的标签元素 四、获取元素的…

图论 - 二分图(染色法、匈牙利算法)

文章目录 前言Part 1:染色法判定二分图1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 Part 2:匈牙利算法求二分图的最大匹配1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 前言 本篇博客将介绍两种二分图有关的算法&#xf…

CSS【详解】居中对齐 (水平居中 vs 垂直居中)

水平居中 内部块级元素的宽度要小于容器(父元素) 方案一&#xff1a;文本居中对齐&#xff08;内联元素&#xff09; 限制条件&#xff1a;仅用于内联元素 display:inline 和 display: inline-block; 给容器添加样式 text-align:center<!DOCTYPE html> <html lang&q…

微软为金融界带来革命性突破——推出Microsoft 365中的下一代AI助手:Microsoft Copilot for Finance

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

阿里云搭建私有docker仓库(学习)

搭建私有云仓库 首先登录后直接在页面搜索栏中搜索“容器镜像服务” 进入后直接选择个人版&#xff08;可以免费使用&#xff09; 选择镜像仓库后创建一个镜像仓库 在创建仓库之前我们先创建一个命名空间 然后可以再创建我们的仓库&#xff0c;可以与我们的github账号进行关联…

云原生架构技术揭秘:DevOps 技术打破开发运维壁垒,实现持续交付的变革之道

DevOps 是一套将软件开发&#xff08;Development&#xff0c;Dev&#xff09;和系统运维&#xff08;Operations&#xff0c;Ops&#xff09;相结合的实践&#xff0c;旨在缩短应用系统开发生命周期&#xff0c;提供高质量的持续交付。 —— 维基百科 DevOps 0、讲在前面 生…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:显隐控制)

控制组件是否可见。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 visibility visibility(value: Visibility) 控制组件的显隐。 卡片能力&#xff1a; 从API version 9开始&#xff0c;该接口支持在…

BP 神经网络原理

BP (Back Propagation) 神经网络是1986年由 Rumelhart 和 McClelland 为首的科学家提出的概念&#xff0c;是一种按照误差逆向传播算法训练的多层前馈神经网络&#xff0c;是应用最广泛的神经网络。 1 BP 神经网络的结构和传播规则 BP神经网络由 输入层、隐含层&#xff08;也…

Revit-二开之立面视图创建FilledRegion-(3)

在上一篇博客中介绍了FilledRegion的创建方法,这种方法通常只在平面视图中适用,在三维视图中也是无法创建的(目前研究的是这样的,如果有其他方法,请赐教)。 本片文章介绍一个下在立面视图中创建FilledRegion的方法,主要操作是在立面视图中拾取一个点,然后以该点为原点,…

javaweb day9 day10

昨天序号标错了 vue的组件库Elent 快速入门 写法 常见组件 复制粘贴 打包部署

PYTHON 自动化办公:压缩图片(PIL)

1、介绍 在办公还是学习过程中&#xff0c;难免会遇到上传照片的问题。然而照片的大小限制一直都是个问题&#xff0c;例如照片限制在200Kb之内&#xff0c;虽然有很多图像压缩技术可以实现&#xff0c;但从图像处理的专业来说&#xff0c;可以利用代码实现 这里使用的库函数是…

【Redis知识点总结】(一)——各种数据结构及其应用场景

Redis知识点总结&#xff08;一&#xff09;——基础数据类型及其应用场景 基础数据类型基础数据类介绍底层数据结构SDS&#xff08;简单动态字符串&#xff09;list&#xff08;双向链表&#xff09;ziplist&#xff08;压缩列表&#xff09;quicklist&#xff08;快速表&…

Unity3D学习之Lua热更新解决方案(二)XLua

文章目录 1 XLua概述2 xLua导入和AB包相关准备3 C#调用Lua3.1 Lua解析器3.2 文件加载重定向3.3 Lua解析器管理器3.3.1 重定向AB包内的Lua3.3.2 获得_G大表 3.4 全局变量的获取3.5 全局函数的获取3.5.1 无参无返回3.5.2 有参有返回3.5.3 多返回值3.5.4 变长参数 3.6 List和Dicti…

策略模式 详解 设计模式

策略模式 策略模式是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装到具有共同接口的独立类中&#xff0c;并且使它们可以相互替换。 策略模式可以让算法的变化独立于使用算法的客户端。 主要解决&#xff1a; 在有多种算法相似的情况下&#…