Spring中@Conditional注解详解

news2024/12/29 10:41:10

文章目录

  • @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。
  • 首先创建Dog类
  • 然后创建MyCondition类
  • 定义两个Bean
  • 测试方法AnnotationConfigApplicationContext
  • 测试@ConditionalOnBean和@ConditionalOnMissingBean注解

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站点击跳转浏览。

@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。

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

从代码中可以看到,需要传入一个Class数组,并且需要继承Condition接口:

@FunctionalInterface
public interface Condition {
    boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

Condition是个接口,需要实现matches方法,返回true则注入bean,false则不注入。

用法如下

在这里插入图片描述

下面举例测试Condition的注入Bean

首先创建Dog类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dog {
    private String name;
    private String gender;
}

然后创建MyCondition类

重写matches方法, 返回true则注入bean,false则不注入
如果容器中注入了 dog 就返回true

public class MyCondition implements Condition {
    /**
     * 重写matches方法, 返回true则注入bean,false则不注入。
     * */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
        // 如果容器中注入了 dog 就返回true
        if(beanFactory.containsBean("dog")){
            return true;
        }
        return false;
    }
}

定义两个Bean

@Configuration
public class MyConfig {

    @Bean("dog")
    //@ConditionalOnBean(name = {"dog2"})
    public Dog dog1(){
        return new Dog("金毛","公");
    }

    @Bean("dog1")
    @Conditional(value = MyCondition.class)
    public Dog dog2(){
        return new Dog("拉布拉多","母");
    }
}

测试方法AnnotationConfigApplicationContext

AnnotationConfigApplicationContext是一个独立的应用上下文,它接受带注释的类作为输入。
例如@Configuration或@Component。 可以使用scan()查找 Bean,也可以使用register()注册 Bean。

public class tets {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfig.class);
         Map<String, Dog> beansOfType = applicationContext.getBeansOfType(Dog.class);
        System.out.println(beansOfType);
    }
}


测试结果如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0E3qWV9I-1673088393503)(Spring%20@Conditional%E6%B3%A8%E8%A7%A3.assets/image-20230104162057475.png)]

如果将MyCondition类中逻辑改为,如果如果容器中之前注入了 dog 就返回false,不注入其他的,
即:

public class MyCondition implements Condition {
    /**
     * 重写matches方法, 返回true则注入bean,false则不注入。
     * */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
        // 如果容器中之前注入了 dog 就返回false
        if(beanFactory.containsBean("dog")){
            return false;
        }
        return true;
    }
}

那么结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y5YxGAQx-1673088393504)(Spring%20@Conditional%E6%B3%A8%E8%A7%A3.assets/image-20230104162343817.png)]

@Conditional本身还是一个父注解,派生出大量的子注解,如下:

@ConditionalOnBean:当容器中有指定Bean的条件下进行实例化。
@ConditionalOnMissingBean:当容器里没有指定Bean的条件下进行实例化。
@ConditionalOnClass:当classpath类路径下有指定类的条件下进行实例化。
@ConditionalOnMissingClass:当类路径下没有指定类的条件下进行实例化。
@ConditionalOnWebApplication:当项目是一个Web项目时进行实例化。
@ConditionalOnNotWebApplication:当项目不是一个Web项目时进行实例化。
@ConditionalOnProperty:当指定的属性有指定的值时进行实例化。
@ConditionalOnExpression:基于SpEL表达式的条件判断。
@ConditionalOnJava:当JVM版本为指定的版本范围时触发实例化。
@ConditionalOnResource:当类路径下有指定的资源时触发实例化。
@ConditionalOnJndi:在JNDI存在的条件下触发实例化。
@ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时触发实例化。

测试@ConditionalOnBean和@ConditionalOnMissingBean注解

修改之前的配置类如下

@Configuration
public class MyConfig {

    @Bean("dog")

    public Dog dog1(){
        return new Dog("金毛","公");
    }

    @Bean("dog1")
    @ConditionalOnBean(name = {"dog"})// spring容器中有dog这个Bean 才会创建dog1
//    @ConditionalOnMissingBean(name = {"dog"})// spring容器中不存在 dog这个Bean 才会创建dog1
    public Dog dog2(){
        return new Dog("拉布拉多","母");
    }
}

结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hPUXUWPh-1673088393505)(Spring%20@Conditional%E6%B3%A8%E8%A7%A3.assets/image-20230104163639174.png)]

然后再将第二个注释放开,第一个注释注释掉
结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z9erSSTI-1673088393505)(Spring%20@Conditional%E6%B3%A8%E8%A7%A3.assets/image-20230104163855985.png)]

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

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

相关文章

51单片机学习笔记_8 IICAT24C02 芯片的应用

I2C EEPROM I2C I2C&#xff08;Inter&#xff0d;Integrated Circuit&#xff09;总线是由 PHILIPS 公司开发的两线式 串行总线&#xff0c;用于连接微控制器及其外围设备。 I2C 结构 I2C 只有两根双向信号线&#xff0c;一根是 SDA 数据线&#xff0c;一根是 SCL 时钟线。…

2-选择题练手

1.HASH函数冲突处理方式不包括以下哪一项 A.开放定址法 B.链地址法 C.插入排序法 D.公共溢出区发 答&#xff1a;C 析&#xff1a; HASH函数冲突处理方式有&#xff1a; 开放定址法&#xff1a;&#xff08;线性探测再散列&#xff0c;二次探测再散列&#xff0c;伪随机…

Netty进阶——粘包与半包(固定分隔符方式解决粘包问题)

目录一、固定分隔符方式解决粘包问题&#xff08;代码示例&#xff09;1.1、固定分隔符解决粘包问题的服务端代码示例1.2、固定分隔符方式解决粘包问题的客户端代码示例1.3、分别启动服务端&#xff0c;客户端&#xff0c;查看服务端结果输出一、固定分隔符方式解决粘包问题&am…

vitepress(四):引入vue组件

这节课的内容需要有前置的良好的Vue基础&#xff0c;如果你仅仅想搭建一个存放md文件的网站的话&#xff0c;可以不必学习后面的内容&#xff0c;当然如果你想个性化自己的站点&#xff0c;那么推荐你学习一下引用的方式和注意点&#xff0c;开始你的个性化之旅 编写VUE组件 …

ARES Map地理信息系统(GIS)

ARES Map地理信息系统(GIS) ARES地图是GRAEBERT的地理信息系统(GIS)产品。该软件是一个复合解决方案&#xff0c;它将GIS的知识和内容放在一个CAD丰富的DWG系统上&#xff0c;并允许您同时使用它们。该软件的地图和设计将以DWG格式自然存储&#xff0c;但它们也可以包含GIS信息…

【阶段三】Python机器学习02篇:机器学习项目流程

本篇的思维导图: 机器学习项目流程 大致分为以下6个环节: (1)项目背景(问题定义) (2)数据收集 (3) 数据预处理与探索性数据分析 (4) 特征工程 (5)构建模型:机器学习模型(算法)的选择

TCP 慢启动突发丢包

TCP 慢启动会导致持续突发丢包。 慢启动以 y2xy2^xy2x 增加窗口&#xff0c;在 BDP 已经填满时&#xff0c;后续的慢启动过程如下&#xff1a; ​每一个 ACK 触发 2 个 报文&#xff0c;最终至少丢掉 1 个 BDP 的数据后 sender 才能检测到丢包而退出慢启动并进行重传。 这是…

C语言蓝桥杯刷题:明码

题目链接 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 汉字的字形存在于字库中&#xff0c;即便在今天&#xff0c;16*16 点阵的字库也仍然使用广泛。 16*16 点阵的字库把每个汉字看成是 1616 个像素信息。并把这些信息记…

电子书销售是一种可以躺赚的商业模式么?

文章目录前言电子书销售市场规模到底有多大&#xff1f;电子书产业链电子书阅读平台电子书销售平台国外国内其它销售模式探讨创建电子书创建电子书的工具电子书下载好去处相关法规前言 不知何时&#xff0c;有了网赚一词&#xff0c;例如去各大平台撸羊毛薅羊毛&#xff0c;利…

Vector - VT System - 继电器板卡_VT2820

这块板卡应该是我个人最喜欢的板卡了&#xff0c;虽然说有很多的模拟板卡、数字板卡等仿真板卡&#xff0c;但是在实际的应用中&#xff0c;我们仿真还是很难做到绝对的信号一致&#xff0c;但是如果有实际的硬件&#xff0c;通过继电器板卡就很好的模拟实际车上的场景&#xf…

定时器(Timer)

一、定时器是什么&#xff1f; 定时器类似于我们生活中的闹钟&#xff0c;可以设定一个时间来提醒我们。 而定时器是指定一个时间去执行一个任务&#xff0c;让程序去代替人工准时操作。 标准库中的定时器: Timer 方法作用void schedule(TimerTask task, long delay)指定dela…

JS数组对象——中文按照首字母排序(分组)sort()、localeCompare()

JS数组对象——中文按照首字母排序&#xff08;sort 、localeCompare&#xff09;往期同类文章场景复现根据中文首字母排序1、首字母基础排序2、排序并且分组往期同类文章 文章内容文章链接JS数组对象——根据日期进行排序&#xff0c;按照时间进行升序或降序排序https://blog…

PLC算法系列之数字低通滤波器(离散化方法:双线性变换)

低通滤波器在信号处理专栏有后向欧拉法的详细介绍和源代码,请查看相应的文章,链接如下: PLC信号处理系列之一阶低通(RC)滤波器算法_RXXW_Dor的博客-CSDN博客_rc滤波电路的优缺点1、先看看RC滤波的优缺点 优点:采用数字滤波算法来实现动态的RC滤波,则能很好的克服模拟滤波…

windows下安装不同版本Python教程

前言 博主也是很长一段时间没有更新文章了吧&#xff0c;因为最近都在忙着升级我的API管理系统&#xff0c;还有准备会考&#xff0c;时隔大概一个月&#xff0c;我带来了本次文章&#xff0c;如何在windows系统下安装多个版本Python&#xff0c;且各版本Python有不同的全局命…

认真学习MySQL中的那些日志文件-二进制日志(binlog)

binlog即binary log&#xff0c;二进制日志文件&#xff0c;也叫作变更日志&#xff08;update log&#xff09;。它记录了数据库所有执行的DDL和DML等数据库更新事件的语句&#xff0c;但是不包含没有修改任何数据的语句&#xff08;如数据查询语句select、show等&#xff09;…

Allegro174版本新功能介绍之关闭拷贝铜皮带网络属性功能

Allegro174版本新功能介绍之关闭拷贝铜皮带网络属性功能 Allegro在172以及以下的版本的时候,拷贝铜皮的时候会自动带上被铜皮的网络属性,在升级到了174版本的时候,是可以随时关闭和打开这个功能的,如下图 除了铜皮,过孔也是可以关闭和打开这个功能的,具体操作如下 选择Se…

NOTE:2022年11月27日以后精密星历采用长命名

IGS切换到新的参考框架—IGS20&#xff0c;以作为其产品的基础。IGS20 与 2022 年 4 月发布的 ITRF2020 密切相关。最新的卫星和地面天线校准 igs20.atx 也将同时生效&#xff0c;与 IGS20 一起使用。IGS 打算从 GPS 第 2238 周&#xff08;2022 年 11 月 27 日&#xff09;的产…

一篇分析Linux虚拟化KVM-Qemu分析之timer虚拟化

说明&#xff1a; KVM版本&#xff1a;5.9.1QEMU版本&#xff1a;5.0.0工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 先从操作系统的角度来看一下timer的作用吧&#xff1a; 通过timer的中断&#xff0c;OS实现的功能包括但不局限于上图&#xff1a; 定时…

RootPort的completion timeout为什么不能防止MCE

PCIe split transaction协议在解释completion timeout机制前&#xff0c;我们首先说一下PCIe split transaction协议是什么&#xff0c;以及为什么PCIe要选择split transaction&#xff1f;Split transaction协议是从PCI-X总线的引入的一个重要特性&#xff0c;该传输协议替代了…

微服务 分布式配置中心Apollo详解

微服务 分布式配置中心Apollo详解1. 配置中心概述1.1 配置中心简介1.2 配置中心特点1.3 配置中心对比2. Apollo概述2.1 Apollo简介2.2 Apollo特点3. Apollo设计实现3.1 基础模型3.2 架构设计3.3 Why Eureka3.4 模块说明4. Apollo安装部署4.1 部署说明4.2 环境准备3.3 下载安装包…