springboot的@ConditionalOnBean注解

Spring Boot的自动装配中的@ConditionalOnBean条件装配注解在Spring启动过程中,是如何保证处理顺序靠后的 Spring Boot的自动装配中的@ConditionalOnBean条件装配注解在Spring启动过程中,是如何保证处理顺序靠后的 @ConditionalOnBean条件装配的顺序就是Spring的DeferredImportSelector接口延迟处理机制来保证的。 阅读详情

上篇文章中分析了springboot的自动注入的原理,可在文章后面的推荐阅读中温习哦。在自动注入的原理那篇文章中提到了@ConditionalOnXX注解,今天来看下springboot中的@ConditionalOnXX注解,该注解表示的是一类注解。马上开始吧。

一、@ConditionalOnXX注解初识

@ConditionalOnXX注解被定义在了spring-boot-autoconfigure包中,有以下几个,

从上图中可以看到经常碰到的@ConditionalOnBean、@ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnMissingClass、@ConditionalOnProperty、@ConditionalOnResource、@ConditionalOnSingleCandidate等。这些注解均在”org.springframework.boot.autoconfigure.condition“包下,感兴趣的小伙伴可以自行查看源码。

二、深入@ConditionalOnBean注解

上面提到了多个@ConditionalOnXX注解,下面逐一对这些常见的注解进行讲解。有意思的是,这些注解很多都是成对出现的,而且意思都是相近的。今天先来看下@CondtionalOnBean注解

2.1、@ConditionalOnBean

@ConditionalOnBean注解的定义如下,

可以明确的一点是 @ConditionalOnBean可以用在类/方法上 。可以配置的属性有下面这些,

平时用的比较多的有value、type、name三个,这三个可以看到都是数组,也就是说可以配置多个。

上面提到@ConditionalOnBean可以配置在方法上,是所有的方法都可以吗?

2.2、@ConditionalOnBean如何标识方法

@ConditionalOnBean标识在方法上,可以标识在所有的方法上吗,这个我们要从该注解的注释上去找答案了。

从上面的注释可以知道,@ConditionalOnBean注解使用在@Bean标识的方法上,都知道@Bean注解的作用是向容器中注入一个bean,也就是@ConditionalOnBean作用的时机是在生成bean的时候。再看注释“the bean class defaults to return type of the factory method”,大体意思是默认返回的bean是工厂方法的类型,这个不好理解,通过一个例子看下。

2.2.1、@ConditionalOnBean(value=)

MyAutoConfig.java

package com.my.template.config;

import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 配置类
 * @date 2022/7/2 15:02
 */
@Configuration
public class MyAutoConfig {

    @Bean(value = "classA")
    public ClassA classA(){
        return new ClassA();
    }
    @Bean
    @ConditionalOnBean(value = {ClassA.class})
    public ClassB classB(){
        return new ClassB();
    }
}

在上面的配置类中,在@Bean注解的方法上使用了@ConditionalOnBean注解,注解中使用的value属性,代表的是只要存在ClassA这个类边会执行classB()方法,下面看ClassA和ClassB都很简单,就是两个普通的类,

ClassA.java和ClassB.java

package com.my.template.config;
/**
 * @date 2022/7/2 15:03
 */
public class ClassA {
    public ClassA() {
        System.out.println("constructor classA");
    }
}
package com.my.template.config;

/**
 * @date 2022/7/2 15:04
 */
public class ClassB {
    public ClassB() {
        System.out.println("constructor classB");
    }
}

看下启动日志是否会打印构造方法中的日志,

可以看到正常打印了,也就是说ClassA和ClassB均被注入到了容器中,这是使用@ConditionalOnBean(value=)的情况,下面看使用@ConditionalOnBean(type=)的情况,

2.2.2、@ConditionalOnBean(type=)

这里的type要求填入的是类的全路径,比如com.my.template.config.ClassA

把配置类中修改为下面的样子,

再次启动观察日志,

从日志中可以看到依旧是可以的,下面我把MyAutoConfig类中的classA()方法,放到classB()方法下面,

再执行看日志,

可以看到没有执行ClassB的构造方法,也就是classB()方法没执行。 可以得出:在配置类中的@Bean标识的方法是有顺序的,前边的会先解析,后边的后解析,后面的要引用前面的是引用不到的,反之则可以。

这种方式下,没有其他方式可以执行classB()方法吗,有的,使用@ConditionalOnClass(value={ClassA.class}),感兴趣的小伙伴可以自己试试哦。

2.2.3、@ConditionalOnBean(name=)

下面看使用name属性的情况,

MyAutoConfig.java修改成下面的样子,

启动日志如下,

正常启动,且初始化了ClassB类。

2.3、ConditionalOnBean标识类

这里说的标识类,我们一般都默认为标识配置类,即带有@Configuration注解的类。这里同时会有value、type、name三种不同的属性配置,需要注意的是value配置的是Class对象,标识的是只要在解析过程中加载了该类即可。type配置的是全类名,name配置的是bean的名称,type和name的配置要求的是需要解析了该BeanDefinition,同时和顺序是有关系的。演示下面的例子

MyAutoConfig.java

package com.my.template.config;

import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 自动配置类
 * @date 2022/7/2 15:02
 */
@Configuration
@ConditionalOnBean(type = {"com.my.template.config.ClassA"})
public class MyAutoConfig {
    public MyAutoConfig(){
        System.out.println("constructor MyAutoConfig");
    }
}

MyAutoConfig2.java

package com.my.template.config;

import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 自动配置类
 *
 * @author wangcj5
 * @date 2022/7/2 15:02
 */
@Configuration
public class MyAutoConfig2 {
    @Bean
    public ClassA classA(){
        return new ClassA();
    }
    public MyAutoConfig2(){
        System.out.println("constructor MyAutoConfig2");
    }
}

启动日志如下,

可以看到实例化了MyAutoConfig2,但是MyAutoConfig确没有,这是因为其类上有@ConditionalOnBean(type = {"com.my.template.config.ClassA"})注解,且在解析MyAutoConfig时并未解析ClassA,把该注解换成@ConditionalOnBean(value= {ClassA.class})看看可以吗

可以看到还是不行,那么换成@ConditionalOnClass(value={ClassA.class})

完美解决问题。

三、总结

本文主要分析了@ConditionalOnBean注解的使用场景,

1、该注解的作用时机是在生成bean的时候,确切的说是在解析beanDefinition的时候

2、该注解可以用在配置类和标识有@Bean的方法上;

3、三个常用属性value、name、type均有解析顺序的问题;

4、value、name、type各自的配置方式

本次分享就到这里了,下次,我们@ConditionalOnClass注解见。

推荐阅读

深入理解springboot的自动注入

我的第一个springboot  starter

Spring Boot注解——@ConditionalOnMissingBean和@ConditionalOnBean @ConditionalOnMissingBean和@ConditionalOnBean作用是相反的 主要介绍@ConditionalOnMissingBean @Configuration public class RedisConfig { @Bean @ConditionalOnMissingBean(name="redisTemplate") public Redi... 阅读详情

相关推荐

Ubuntu 22.04蓝牙开关秒关?别慌,可能是这个Intel固件文件在搞鬼

本文深入解析Ubuntu 22.04蓝牙开关秒关问题,指出Intel固件文件缺失是常见原因,并提供详细修复方案。通过确认硬件型号、检查固件文件及智能替代方案,帮助用户快速解决蓝牙故障,提升系统稳定性。

weixin_30247307的博客 758

SpringBoot注解之@ConditionalOnBean

1.@ConditionalOnBean @ConditionalOnBean的作用和用法 @ConditionalOnBean注解是,如果有容器中有Computer类,就注入备用电脑Computer类,如果有Computer就不注入;可以自己换个注解试一下就知道了, 2.@ConditionalOnProperty @ConditionalOnProperty的作用和用法 在spring boot中有时候需要控制配置类是否生效,可以使用@ConditionalOnProperty注解来控制@Co

wzc_dazhi的博客 989

Eureka自我保护机制

Eureka自我保护机制 默认情况下,当eureka server在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是90秒),但是,如果短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制,比如在开发测试时,需要频繁地重启微服务实例,但是我们很少会把eureka server一起重启(因为在开发过程中不会修改eureka注册中心),当一分钟内收到的心跳数大量减少时,会触发该保护机制。可以在eureka管理界面看到Renews threshold和Renews(last

Soul_Ming的博客 543

springboot2启动信息去除CONDITIONS EVALUATION REPORT后引发的思考

前言 最近启动一个springboot2.2+版本项目时,发现控制台输出 17:22:05 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.cloud.util.random.CachedRandomPropertySourceAutoConfiguration' 17:22:05 [main] DEBUG o.s.b.

AlbenXie的博客 3252

不修改MMDetection源码使用自定义数据和模型

以目标检测为例,用非侵入式的模型和MMDetection数据的方法进行配置。也就是不改动MMDetection的任何源码或目录的条件下,使用自定义数据训练自定义模型。

Dlite的技术笔记 1344

(8)机器人动力学

机器人是一个具有多输入多输出的复杂动力学系统,存在严重的非线性,需要非常系统的方法对机器人进行动力学研究。常用的机器人动力学建模方法有:Lagrange(拉格朗日)动力学方法、Newton-Euler(牛顿-欧拉)动力学方法、Gauss(高斯)动力学方法、Kane(凯恩)动力学方法等。机器人动力学研究的是机器人的运动和作用力之间的关系。机器人的动力学问题包括动力学正问题和动力学逆问题。动力学正问题是对于给定的关节驱动力......

rouyu308的博客 9500

AopAutoConfiguration matched的异常

Positive matches: ----------------- AopAutoConfiguration matched: - @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition) AopAutoConfiguration.ClassProxyingConfiguration matched: - @ConditionalOnMissingClass did no...

lklk666的博客 5357

SpringBoot实战(二十八)集成 Collabora Online 实现在线编辑

SpringBoot实战(二十八)集成 Collabora Online 实现在线编辑

ACGkaka的博客 6984

spring boot 启动的自动配置查询

启动方式:在application.properties或者application.yml文件中加入debug=true或者debug: true============================CONDITIONS EVALUATION REPORT============================Positive matches:-----------------   AopAut...

csdn_bu的博客 3万+

华为OD机考双机位C卷 - 构成正方形的数量 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 成正方形的数量 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 5939

开放平台实现安全的身份认证与授权原理与实战:使用OAuth 2.0实现授权码模式

作者:禅与计算机程序设计艺术 1.背景介绍 随着互联网应用的飞速发展,各种网站、App、小程序等都将逐渐向用户提供了丰富的功能和服务。在这些应用中,用户通常需要登录才能使用这些服务,这就涉及到用户信息的安全问题。如果用户的信息被泄露或篡改,那么可能造成严重后果。因此,为这些应用提供安全且健壮的身份验

AI天才研究院 494

SpringBoot 之 @ConditionalOnBean 或 @ConditionalOnMissingBean 失效案例

SpringBoot 之 @ConditionalOnBean 或 @ConditionalOnMissingBean 失效案例。

bluemysky的博客 2867

Codex CLI 手机号验证失败?5 种接码平台实测对比与绕过地区限制的 3 步操作

揭示 Codex CLI 手机号验证失败的真实原因在于上下文污染而非网络问题,分析其通过 ASN、Accept-Language 和 TLS SNI 三重加权风控的机制,并实测对比 5 种接码平台在 DNS 解析路径、ASN 干净度和复用间隔上的差异,提出剥离浏览器指纹、固化 TLS SNI、隔离

weixin_42627902的博客 741

Spring Boot 中的 @ConditionalOnBean 注解详解

在 Spring Boot 中,条件注解(Conditional 注解)是一种强大的功能,允许我们根据某些条件动态地注册或跳过特定的 Bean。其中,当 Spring 容器中存在指定的 Bean 时,当前 Bean 才会被注册。本篇文章将详细介绍的使用场景、原理,并提供多个示例帮助理解。✅指定 Bean 类型✅指定 Bean 名称✅指定 Bean 注解✅搜索范围你在项目中用过吗?欢迎留言分享你的经验!🚀。

weixin_44563169的博客 1856

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Springboot中的@ConditionalOnBean注解:使用指南与最佳实践

ConditionalOnBean是Spring Boot中提供的一个条件注解。简单来说,它的作用是检查某个指定的Bean是否存在。如果Bean存在,那么Spring容器就会实例化与这个注解相关联的Bean。这种方式可以避免在没有特定依赖的情况下加载不必要的组件,提高应用的启动速度和资源使用效率。不管你的项目多么复杂,合理使用@ConditionalOnBean可以减少不必要的依赖,提升服务的性能。当我们需要确保特定的Bean存在时,用这个注解再合适不过!

分享AI大模型相关前沿技术、最新人工智能资讯 1096

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Spring Boot-@Conditional注解以及衍生注解@ConditionalOnBean

@Conditional:判断@Conditional指定的条件是否成立,如果成立才会给容器中添加组件,配置类里面的内容才会生效 我们发现有很多的自动配置类,但是这些自动配置类都有指定的条件,必须满足这些条件,自动配置才会生效,比如 那我们怎么查看哪些自动配置类生效了呢 可以通过debug模式 1.application.properties配置以下内容 2.启动运行我们就可以查看到哪些自动配置类生效了 Positive matches:代表生效的自动配置类 Negative matches:没有生

Kevinnsm的博客 414

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SpringBoot原理篇:bean的加载控制(注解式)、@ConditionalOnClass、@ConditionalOnMissingClass、 @ConditionalOnBean

@ConditionalOnClass → 如果有属性里的 class就加载对应的bean @ConditionalOnMissingClass → 如果没有属性里的class才加载对应的bean @ConditionalOnBean → 如果spring容器里有属性里写的bean,就返回对应的bean

m0_45877477的博客 2637

SpringBoot2 | 条件注解 @ConditionalOnBean 原理源码分析(七)

条件注解是Spring4提供的一种bean加载特性,主要用于控制配置类和bean初始化条件。在springBoot,springCloud一系列框架底层源码中,条件注解的使用到处可见。 本篇就来探讨一下比较常用的一个调节注解:@ConditionalOnBean。可能不少人在使用该注解时会遇到不生效的情况:@ConditionalOnBean依赖的 bean 明明已经配置了,但就是不生效。@C...

程序员阿康 1万+

SpringBoot 处理@ConditionalOnBean注解的顺序问题

前言 由于最近自己有些懒散,导致自己已经很长时间没有学习技术并撰写博客来沉淀自己了。最近公司有一个业务中台功能需求的任务,大致需求简述如下: 需要为Spring操作MongoDB的save方法添加一个切面,来对指定PO对象的save操作进行一个日志追溯功能(记录前后功能的变化)。 当这个需求下来的时候,我内心OS为: 以我对spring的熟悉程度,这个任务简直是为我量身定做的。 于是我主动请战,揽下了这个需求,并进行了开发。 一、设计思路 主要核心的设计思路这里就不阐述了。但有这么一个功能,

avengerEug的博客 4088

24、springboot的自动配置01--类条件注解@ConditionalOnClass、bean条件注解@ConditionalOnBean

springboot的自动配置01--类条件注解@ConditionalOnClass、bean条件注解@ConditionalOnBean

Java 领域技术分享 1323

SpringBoot中Condition包下常用条件依赖注解详细介绍及案例使用

java中Condition下常用注解详细介绍及案例使用@ConditionalOnClass() Spring中存在指定class对象时,注入指定配置@ConditionalOnMissingClass() Spring中不存在指定class对象时,注入指定配置@ConditionalOnBean() 根据ioc中判断有没有此实例对象,有则加载指定配置ConditionalOnMissingBean() 根据ioc中判断有没有此实例对象,没有则加载指定配置 @ConditionalOnClass() Sp

weixin 19953181360 2417

springboot注解详解(二)Spring Bean 注解、Spring DI注解与Scops注解

一、容器配置注解 1、@Autowired @Autowired注解用于标记Spring将要解析和注入的依赖项。此注解可以作用在构造函数、字段和setter方法上。 2、@Primary 当系统中需要配置多个具有相同类型的bean时,@Primary可以定义这些Bean的优先级。 3、@PostConstruct与@PreDestroy 值得注意的是,这两个注解不属于Spring,它们是源于JSR-250中的两个注解,位于common-annotations.jar中。@PostConst...

weixin_45987961的博客 281
上一篇: Java 近期新闻:Classfile API 草案、Spring Boot、GlassFish、Reactor 项目、Micronaut
下一篇: Java 8 要倒了? Jenkins 宣布仅支持 Java 11 及以上版本
程序员职业指南
博客等级 码龄4年 2138粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值