条件注解@ConditionalOnBean失效原因_zhm_sky的博客-程序员宅基地_conditionalonbean不生效

技术标签: spring boot  java  

测试环境(配置类)

@Import({
    User.class,Pet.class})
@Configuration(proxyBeanMethods = true)
public class MyConfig {
    

    @Bean
    @ConditionalOnBean(name = "cat")     
    public User user(){
    

        return new User("航书", 12);

    }
    @Bean("cat")  
    public Pet dog(){
    
        return new Pet("狗");
    }
}

测试代码:

        String[] names = run.getBeanNamesForType(Pet.class);
        for (String name : names) {
    
            System.out.println(name);
        }
        System.out.println("--------------------------------------------------------");
        boolean cat = run.containsBean("cat");
        System.out.println(cat);
        boolean user2 = run.containsBean("user");
        System.out.println(user2);

打印测试结果:
在这里插入图片描述
结果分析:
com.zhmsky.boot.pojo.Pet:这是通过@Import自动导入的组件
cat:通过@Bean 注册的组件

IOC容器中包含cat组件,但是没有包含user组件,也就是此时条件配置注解失效

解决办法
注意条件注解中的条件组件必须要先完成注册,也就也是条件里的判断组件必须要先包含在IOC容器中。

@Import({
    User.class,Pet.class})
@Configuration(proxyBeanMethods = true)   
public class MyConfig {
    

    @Bean("cat")  
    public Pet dog(){
    
        return new Pet("狗");
    }
    @Bean  
    @ConditionalOnBean(name = "cat")     
    public User user(){
    
        return new User("航书", 12);
    }
    
}

在这里插入图片描述
此时条件注解生效!
结论:
springboot加载组件有一定的顺序,条件注解里的判断条件一定要先注册(@ConditionalOnBean(name = “cat”) 对应cat组件先完成注册

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42194695/article/details/121284084

智能推荐

什么是链接,为什么需要链接?_陶通宁的博客-程序员宅基地_程序为什么需要链接

为什么需要链接 在实际开发中,我们一定是多文件编程,所有文件在编译后,需要合在一起,合在一起的过程就是链接的过程。 每一个源文件(就是.c文件,上图中的程序1)都有对应的零碎文件(就是.h文件),通过预编译(通过#include实现)把.c和.h文件整合成一个组合C文件,这个组合C文件的扩展名为.i。把组合C文件编译成汇编文件.s,目标文件为机器指令(放在一个.o文件当中),单个目标文件是不能工作的,因为各个目标文件是相互支撑工作的。 把各个...

SpringCloud Alibaba Nacos作为配置中心(十)--------自定义登录用户名和密码_jingle_1995的博客-程序员宅基地

上一篇已经介绍了 Nacos Server的 简单登录功能,说白了就是启动了一个0.8.0版本的server,这一篇记录一下自定义用户名和密码。下面开始设置自定义 用户和密码: 修改使用mysql数据库存储配置信息。Nacos Server默认使用的是内嵌的cmdb数据库 在配置文件(./conf/application.properties)添加配置 spring.dataso...

关于接口 RandomAccess_weixin_34192993的博客-程序员宅基地

今天看到java.util.Collections这个工具类中的 public static <T> void fill(List<? super T> list, T obj) { int size = list.size(); if (size < FILL_THRESHOLD || list instanceof Random...

WPF UI框架界面开发教程(八)_有技巧搬砖的博客-程序员宅基地

主窗体加载Page页滑动并且淡入/淡出显示,这个思路是引用老外的方法public PageAnimation PageLoadAnimation { get; set; } = PageAnimation.SlideAndFadeInFromRight; public PageAnimation PageUnloadAnimation { get; set; } = PageAnimation.SlideAndFadeOutToLeft; public f.

java 模仿支付成功_网站接入支付功能完整教程_weixin_39616045的博客-程序员宅基地

大家好,今天给大家带来网站接入支付功能的演示。本例用支付宝演示。自己开发的网站,需要对接支付宝支付功能需要的几个条件。1、支付宝开放平台注册账号(支持个人账号),开通自己应用功能权限(小程序、网页&移动应用、生活号、第三方应用)https://openhome.alipay.com/platform/home.htm2、服务器(主要用于支付成功的消息通知)3、演示地址:http:...

uniapp修改buttons内容与样式_weixin_42553179的博客-程序员宅基地_uniapp 自定义button样式

// 修改buttonstitleMsg(width, text) { let pages = getCurrentPages(); let page = pages[pages.length - 1]; let currentWebview = page.$getAppWebview(); currentWebview.setTitleNViewButtonStyle(0, { width: width, text: text })}

随便推点

订阅模式类型_ONE*的博客-程序员宅基地_订阅模式

1. 订阅模式类型订阅模式示例图:前面2个案例中,只有3个角色:P:生产者,也就是要发送消息的程序C:消费者:消息的接受者,会一直等待消息到来。queue:消息队列,图中红色部分而在订阅模型中,多了一个exchange角色,而且过程略有变化:P:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给X(交换机)C:消费者,消息的接受者,会一直等待消息到来。Queue:消息队列,接收消息、缓存消息。Exchange:交换机,图中的X。一方面,接收生产者发送的消息。另一方面,

运维自动化闭环,从腾讯走出来的实践_wuqingfeng234的博客-程序员宅基地

运维自动化闭环,从腾讯走出来的实践13 MAY 2016 on 数人云活动本文是数人云深圳技术分享课上优维科技联合创始人彭鲤航的演讲实录,演讲主题是《运维自动化实践》。精彩观点抢鲜看实现运维自动化闭环,最主要就是配置管理、状态管理和变更管理能力。治大国如烹小虾,我们来类比餐厅老板,看如何实现炒菜的自动化:首先,我要知道我的厨房里到底有些什么东西是可用的,比如

解题报告_dengjiao4915的博客-程序员宅基地

author:sdgzy6.12日T1总感觉是一个假题,T3推推式子看出单调性就没了。T2比较有意思:题目大意:n个物品,属性为w,r,选择第i件物品后,之后每选择一个物品都会减去r的价值。求按顺序选择物品的最大价值。solution:考虑对于一个必须选择的物品集合(大小为n)答案是:\(\sum w_i - \sum r_i * (n - i)\)价值总和是\(\...

JSP内置对象讲解_胖团子肉丸子的博客-程序员宅基地

教   学   活   动   首   页                基    本    内    容 第 3 章 JSP 内置对象 教学目的与要求:通过本章的学习让学生了解JSP 内置对象的基本关系;理解session对象的方法,application对象的方法;掌握request对象获取信息,request 对

linux服务器安装anaconda总结_爱学习的小王i的博客-程序员宅基地

一、官网下载linux版安装包https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh二、上传并进行安装将安装包拷贝至服务器,使用cd命令进入安装包所在位置,比如我拷到的是/home下面,就是cd /home。然后使用bash进行安装。cd /homebash Anaconda3-2019.10-Linux-x86_64.sh按照要求输入yes同意阅读协议,并一直按住enter键翻到底开始安装..

java j2se1.5_用 J2SE1.5 建立多任务的Java应用程序_捂脸人的博客-程序员宅基地

J2SE 5.0中的java.util.concurrent程序包提供了一个新的线程框架组件,这个框架组件处理了与建立、执行和管理线程相关的很多低层细节信息。在本文中我们将细致地了解一下它的重要特性。如果你使用C、C++或Java先前的版本进行多线程编程,就知道在代码中管理线程是多么头疼的事情。在单线程程序中,代码中引起应用程序失败的 bug每次都在同一个点出现。但是在多线程程序中,只有某些原因遇...

推荐文章

热门文章

相关标签