【spring】@Conditional注解学习

@Conditional介绍

@Conditional注解用于按照设定的条件进行判断,从而决定是否将某个bean注册到Spring容器中。

@Conditional注解是在Spring 4.0版本中引入的,它提供了一种更加灵活的方式来控制bean的创建和注册。在此之前,开发者通常使用@Profile注解来根据不同的环境配置来加载不同的bean,但@Profile的使用范围相对有限,仅适用于基于环境变量的条件检查。而@Conditional注解则更加通用,允许开发者自定义条件检查策略,从而实现更复杂的条件逻辑。

这个注解可以用于类级别,也可以用于方法级别。

要使用@Conditional注解,你需要创建一个实现了Condition接口的类,并重写matches方法来定义你的条件判断逻辑。当matches方法返回true时,对应的bean将会被注册到Spring容器中;如果返回false,则不会注册。这种机制使得你可以根据应用的配置、环境变量或其他任何条件来决定是否创建某个bean实例。

@Conditional 注解可以与以下条件类一起使用

  • OnClassCondition:检查类路径中是否存在指定的类。

  • OnMissingClassCondition:检查类路径中是否不存在指定的类。

  • OnBeanCondition:检查Spring容器中是否存在指定的Bean。

  • OnMissingBeanCondition:检查Spring容器中是否不存在指定的Bean。

  • OnPropertyCondition:检查系统属性或环境变量是否满足指定的条件。

  • OnResourceCondition:检查类路径中是否存在指定的资源。

  • OnWebApplicationCondition:检查是否是Web应用程序环境。

@Conditional源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
	Class<? extends Condition>[] value();
}
源代码截图

@Conditional 属性介绍

  • value:指定Condition接口的实现类,Condition接口的实现类中需要编写具体代码实现向Spring中注入Bean的条件

@Conditional 注解使用场景

@Conditional注解的使用场景主要体现在以下几个方面:

  • 基于属性配置的条件注入:使用@ConditionalOnProperty可以根据指定的属性是否存在或是否具有特定的值来决定是否创建和注册Bean。这在需要根据配置文件动态决定是否启用某个功能时非常有用。
  • 基于Bean存在的条件注入@ConditionalOnBean注解可以用来检查Spring上下文中是否已经存在某个Bean,如果存在,则创建和注册新的Bean。这在需要某个Bean作为依赖时尤其有用。
  • 基于类存在的条件注入@ConditionalOnClass注解用于检查某个类是否在类路径中可用,如果可用,则进行Bean的创建和注册。这在自动配置和模块加载时非常有用。
  • 基于资源存在的条件注入@ConditionalOnResource注解允许你根据特定资源的存在与否来决定是否创建和注册Bean。这在需要外部资源(如文件、URL等)时很有帮助。
  • 基于Web环境的条件注入@ConditionalOnWebApplication注解用于确保只有在Web环境中才会创建和注册Bean,这对于Web特定功能的自动配置非常有用。
  • 基于SpEL表达式的条件注入@ConditionalOnExpression注解允许你使用Spring Expression Language (SpEL) 来定义复杂的条件表达式,从而控制Bean的创建和注册。
  • 自定义条件实现:你可以自定义实现Condition接口的类,通过实现matches方法来定义自己的条件逻辑。这种方式提供了最大的灵活性,允许你根据任何复杂的条件来决定Bean的创建

@Conditional测试示例代码

示例代码 一
ConditionalDemo类
package com.yang.SpringTest.annotation.conditionalLearn;

import lombok.Data;

/**
 * <p>description</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.conditionalLearn
 * Ceate Time 2024-03-20 14:55
 */
@Data
public class ConditionalDemo {
}
ConditionalDemoCondition类
package com.yang.SpringTest.annotation.conditionalLearn;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

/**
 * <p>description</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.conditionalLearn
 * Ceate Time 2024-03-20 14:52
 */

public class ConditionalDemoCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String osName = context.getEnvironment().getProperty("sun.desktop");
        return osName.contains("windows") ? true : false;
    }
}
ConditionalDemoConfig配置类
package com.yang.SpringTest.annotation.conditionalLearn;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

/**
 * <p>配置类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.conditionalLearn
 * Ceate Time 2024-03-20 14:54
 */
@Slf4j
@Configuration
@Conditional(ConditionalDemoCondition.class)
public class ConditionalDemoConfig {
    @Bean
    public ConditionalDemo demo() {
        log.info("------------- ConditionalDemo init -------------");
        return new ConditionalDemo();
    }
}
ConditionalTest测试类
package com.yang.SpringTest.annotation.conditionalLearn;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Arrays;

/**
 * <p>测试类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.conditionalLearn
 * Ceate Time 2024-03-20 14:58
 */

public class ConditionalTest{
        public static void main(String[] args) {
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionalDemoConfig.class);
            String[] definitionNames = context.getBeanDefinitionNames();
            Arrays.stream(definitionNames).forEach((definitionName) -> System.out.println(definitionName));
        }
}
运行结果




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

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

相关文章

[Redis]——Redis持久化的两种方式RDB、AOF

目录 RDB快照模式 概念&#xff1a; 触发时机&#xff1a; 异步做快照 AOF追加模式 概念&#xff1a; 触发时机&#xff1a; bgrewriteaof命令&#xff1a; 比较两种模式&#xff1a; RDB快照模式 概念&#xff1a; RDB模式就是保存当前Redis的状态到本地磁盘文件&am…

综合应用题——线性表的链式表示(每日更新中...)

一、练习题 01题 在带头结点的单链表L中&#xff0c;删除所有值为x的结点&#xff0c;并释放其空间&#xff0c;假设值为x的结点不唯一&#xff0c;试编写算法以实现上述操作。 【解法1】用p从头至尾扫描单链表&#xff0c;pre指向*p结点的前驱。若p所指结点的值为x&#xf…

【堆、位运算、数学】算法例题

目录 十九、堆 121. 数组中的第K个最大元素 ② 122. IPO ③ 123. 查找和最小的K对数字 ② 124. 数据流的中位数 ③ 二十、位运算 125. 二进制求和 ① 126. 颠倒二进制位 ① 127. 位1的个数 ① 128. 只出现一次的数字 ① 129. 只出现一次的数字 II ② 130. 数字范围…

MATLAB:函数与数值积分

一、数学函数图像的绘制 clc,clear fh (x)2*exp(-x).*sin(x); Xrange [0,8]; gx (x)3*exp(-x)*0.8.*sin(x); fplot(fh,Xrange,r-*,LineWidth,1.5) hold on grid on fplot(gx,Xrange,b-o,LineWidth,1.5) axis([-0.5,8.5,-0.1,0.85]) legend(fh (x)2*exp(-x).*sin(x),gx (x…

【笔记】用三角函数拟合数据(最小二乘法)

0.Matlab自带函数拟合 用三角函数拟合数据简单方便,matlab自带的fittype函数即可完成拟合任务,但是fittype函数仅限于matlab,为了搞懂fittype函数的内含,自己写了一套函数用于拟合。 如下图所示,现有一不规则散点,命令用三角函数拟合,拟合的目标频率w0为0.01m^-1 拟合…

模型部署——RKNN模型量化精度分析及混合量化提高精度

模型部署——RKNN模型量化精度分析及混合量化提高精度&#xff08;附代码&#xff09;-CSDN博客 3.1 量化精度分析流程 计算不同情况下&#xff0c;同一层网络输入值的余弦距离&#xff0c;来近似的查看每一层精度损失的情况。具体量化精度分析的流程如下&#xff1a; 3.2 量…

闪存盘上被删除的文件能被回收站恢复吗?

随着数字设备的普及&#xff0c;闪存盘作为一种便携式的存储设备&#xff0c;已经深入到了我们的日常生活和工作中。然而&#xff0c;在使用闪存盘的过程中&#xff0c;我们可能会不小心删除一些重要的文件。这时&#xff0c;很多人会寄希望于回收站来恢复这些文件。但是&#…

Flutter开发入门——路由

什么是路由&#xff1f; 移动端应用开发中&#xff0c;路由技术是一个非常重要的组成部分。路由技术负责管理应用中各个页面之间的跳转、导航以及参数传递等关键功能。在移动端应用中&#xff0c;一个高效、易于维护的路由系统对于提高开发效率和用户体验具有重要意义。 Flut…

基于Java中的SSM框架实现医院院内物资管理系统项目【项目源码+论文说明】

基于Java中的SSM框架实现医院院内物资管理系统演示 摘要 在当今的中国改革开放经济体制下&#xff0c;中国经济正以快速稳健的步伐前行。并且随着经济的发展&#xff0c;各领域的信息化管理也得到了充足的发展&#xff0c;而且愈发普及。现如今&#xff0c;几乎所有的行业中都…

机器学习_自我总结

文章目录 简介优化算法的方法诊断偏差和方差 简介 我只是一个小白,很多东西写不好,也不是很懂只是记一下笔记对自己的映像更深,也希望有人能够指导我学习(谢谢!) 优化算法的方法 (1)修改学习速率,还有各种(可变)参数1.尝试减少特征的数量2.尝试获得更多的特征3.尝试增加多项…

elment-ui el-tabs组件 每次点击后 created方法都会执行2次

先看错误的 日志打印: 错误的代码如下: 正确的日志打印: 正确的代码如下: 前言: 在element-ui的tabs组件中,我们发现每次切换页面,所有的子组件都会重新渲染一次。当子页面需要发送数据请求并且子页面过多时,这样会过多的占用网络资源。这里我们可以使用 v-if 来进行…

科技助力高质量发展:新质生产力的崛起与企业数字化转型

引言 随着科技的飞速发展&#xff0c;我们正逐渐步入数字化智能时代&#xff0c;这个时代不仅为企业带来了无限的机遇&#xff0c;也让其面对前所未有的挑战。在这个快速变革的时代&#xff0c;企业必须不断调整自己的经营策略&#xff0c;适应数字化转型的浪潮&#xff0c;以…

SQL-Labs靶场“32-33”关通关教程

君衍. 一、32关 GET单引号闭合宽字节注入1、源码分析2、宽字节注入原理3、联合查询注入4、updatexml报错注入5、floor报错注入 二、33关 GET单引号addslashes逃逸注入1、源码分析2、联合查询注入3、updatexml报错注入4、floor报错注入 SQL-Labs靶场通关教程&#xff1a; SQL注入…

【Linux】多线程 --- 同步+POSIX信号量+基于环形队列的生产者消费者模型

线程同步 1. 通过条件变量抛出线程同步概念 在上一篇线程互斥博客就说过&#xff0c;在抢票逻辑中&#xff0c;刚释放完锁的线程由于竞争能力比较强&#xff0c;导致其他线程无法申请到锁&#xff0c;那么长时间其他线程都无法申请到锁&#xff0c;只能阻塞等待着&#xff0c…

福克斯2010 1.8L 手动档

老车了记录点东西 好看也便宜 福克斯维修保养费用调查_保养维护_车系文章_空港平行进口汽车交易服务中心 https://tjautoland.net/article-40.html 福克斯自从上市后&#xff0c;凭借其时尚动感的外形、良好的操控性和极佳的驾乘舒适度&#xff0c;在国内紧凑型市场上持续热…

HJDZ-E800静态中间继电器 DC24V 35mm卡导轨安装 JOSEF约瑟

HJDZ静态中间继电器 系列型号&#xff1a; HJDZ-A200静态中间继电器&#xff1b;HJDZ-A110静态中间继电器&#xff1b; HJDZ-A002静态中间继电器&#xff1b;HJDZ-A004静态中间继电器&#xff1b; HJDZ-E112静态中间继电器&#xff1b;HJDZ-E112L静态中间继电器&#xff1b; HJ…

一步将查询功能添加到公众号菜单和文章

易查分如何将查询功能添加到公众号菜单和文章&#xff0c;实现菜单栏、文章、自动回复均可进行查询。本文给大家详细讲解。 &#x1f50e;接入方式&#xff1a; ✅1.公众号菜单栏接入查询网址 ✅2.公众号菜单栏接入查询小程序 ✅3.公众号菜单栏点击发送查询二维码 ✅4.公众…

提升口才与演讲技巧的有效方法

提升口才与演讲技巧的有效方法 口才与演讲技巧在现代社会中扮演着举足轻重的角色。无论是在职场、学校还是日常生活中&#xff0c;我们都需要借助良好的口才和演讲技巧来表达自己的思想&#xff0c;传递信息&#xff0c;并有效地影响他人。因此&#xff0c;提升口才与演讲技巧…

02分布式搜索引擎ES

elasticsearch查询 1.DSL查询文档1.1.DSL查询分类1.2.全文检索查询1.3.精准查询1.4.地理坐标查询1.5.复合查询 2.搜索结果处理2.1.排序2.2.分页2.3.高亮2.4.总结 3.RestClient查询文档3.1.快速入门3.2.match查询3.3.精确查询3.4.布尔查询3.5.排序、分页3.6.高亮 1.DSL查询文档 …

HTML中的常用标签用法总结(持续更新...)

&#x1f31f; 欢迎来到 我的博客&#xff01; &#x1f308; &#x1f4a1; 探索未知, 分享知识 !&#x1f4ab; 本文目录 1. 标题标签2. 段落标签3. 链接标签4. 列表标签5. 图像标签6. 表格标签 1. 标题标签 <h1>至<h6>用于定义标题。<h1>是最大的标题&am…