之前看到这篇博客,写ConditionalOnClass的用法,自己实践了一下,感觉有点问题,原文如下:

https://blog.csdn.net/lucyTheSlayer/article/details/80430912

于是自己更正了一下,代码结构如下:

贴上完整的代码:

程序入口:ConditionalDemoApplication:
@SpringBootApplication
public class ConditionalDemoApplication implements CommandLineRunner {
@Autowired
private Van van; public static void main(String[] args) {
SpringApplication.run(ConditionalDemoApplication.class, args);
} @Override
public void run(String... args) throws Exception{
van.fight();
}
}

Van.java

@Service
public class Van {
@Autowired
private Fighter fighter; public void fight(){
System.out.println("van:boy next door,do you like 玩游戏");
fighter.fight();
}
}

Fighter.java及其实现类:

public interface Fighter {
void fight();
}
@Service
public class Babana implements Fighter {
@Override
public void fight(){
System.out.println("Banana: 自由的气息,蕉迟但到");
}
}
@Service
public class Billy implements Fighter {
public void fight(){
System.out.println("Billy:吾乃新日暮里的王,三界哲学的主宰。"); }
}

VanConfig:

@Configuration
public class VanConfig {
@Bean
@ConditionalOnBean(Billy.class)
public Fighter fighter(){
return new Billy();
} @Bean
@ConditionalOnMissingBean
public Fighter fighter2(){
return new Babana();
}
}

1、运行程序,输入结果如下:

2、如果将Billy Bean的代码注释掉:

@Configuration
public class VanConfig {
/*@Bean
@ConditionalOnBean(Billy.class)
public Fighter fighter(){
return new Billy();
}*/ @Bean
@ConditionalOnMissingBean
public Fighter fighter2(){
return new Babana();
}
}

重新运行,输入结果如下:

3、或者,我们将Billy上的@Service注解注释掉,让springboot扫描不到该类:

//@Service
public class Billy implements Fighter {
public void fight(){
System.out.println("Billy:吾乃新日暮里的王,三界哲学的主宰。"); }
}

同时恢复VanConfig里的配置:

@Configuration
public class VanConfig {
@Bean
@ConditionalOnBean(Billy.class)
public Fighter fighter(){
return new Billy();
} @Bean
@ConditionalOnMissingBean
public Fighter fighter2(){
return new Babana();
}
}

再次运行,输入结果如下(与第2次试验的效果相同):

4、在第3个试验的基础上,我们再做一个试验,把@ConditionalOnBean(Billy.class)注释掉:

@Configuration
public class VanConfig {
@Bean
// @ConditionalOnBean(Billy.class)
public Fighter fighter(){
return new Billy();
} @Bean
@ConditionalOnMissingBean
public Fighter fighter2(){
return new Babana();
}
}

重新运行,结果如下:

这说明,在不添加ConditionalOnBean条件时,Billy的注入已不再受任何约束的

结论:

1、@ConditionalOnBean(xxx.class)就是为了判断 xxx.class是否存在,并已注释了springboot容器里了;
2、@ConditionalOnMissingBean 则是在第一点不存在的情况下起作用; 当然,我们还继续作一些测试,比如,去掉Babana上的@Service等,再看一看效果会怎样。
好了,分享完毕,该回去干活了...

ConditionalOnBean 与 ConditionalOnMissingBean 的正确玩法的更多相关文章

  1. 【转载】总结一下Android中主题(Theme)的正确玩法

    http://www.cnblogs.com/zhouyou96/p/5323138.html 总结一下Android中主题(Theme)的正确玩法 在AndroidManifest.xml文件中有& ...

  2. 总结一下Android中主题(Theme)的正确玩法

    在AndroidManifest.xml文件中有<application android:theme="@style/AppTheme">,其中的@style/AppT ...

  3. Ceph的正确玩法之Ceph纠删码理论与实践

    http://blog.itpub.net/31545808/viewspace-2637083/ 注意空格,有的命令少空格 随着云计算业务的快速发展,国内外云计算企业的专利之争也愈发激烈.在云计算这 ...

  4. squid+stunnel+用户密码认证的三种玩法

    没办法,应用越来越深入,就会越来越多要求. squid+stunnel+用户密码认证的场景至少以下三个,我会遇到. 1,标准玩法 在服务器上建一个SQUID,加密码认证,然后,其它人通过它上网.(不要 ...

  5. 朱晔的互联网架构实践心得S2E4:小议微服务的各种玩法(古典、SOA、传统、K8S、ServiceMesh)

    十几年前就有一些公司开始践行服务拆分以及SOA,六年前有了微服务的概念,于是大家开始思考SOA和微服务的关系和区别.最近三年Spring Cloud的大火把微服务的实践推到了高潮,而近两年K8S在容器 ...

  6. windows下mongodb基础玩法系列一介绍与安装

    windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下 ...

  7. 第四模块MySQL50题作业,以及由作业引申出来的一些高端玩法

    一.表关系 先参照如下表结构创建7张表格,并创建相关约束                 班级表:class       学生表:student       cid caption grade_id ...

  8. [C#] 软硬结合第二篇——酷我音乐盒的逆天玩法

    1.灵感来源: LZ是纯宅男,一天从早上8:00起一直要呆在电脑旁到晚上12:00左右吧~平时也没人来闲聊几句,刷空间暑假也没啥动态,听音乐吧...~有些确实不好听,于是就不得不打断手头的工作去点击下 ...

  9. git分布式版本控制玩法

    git分布式版本控制玩法 Git distributed version control play github的配置安装步骤:1.下载git bash(从http://www.git-scm.com ...

随机推荐

  1. package---包

    一,包 包(package) 用于管理程序中的类,主要用于解决类的同名问题.包可以看成目录. 包的作用: [1] 防止命名冲突. [2] 允许类组成一个单元(模块),便于管理和维护 [3] 更好的保护 ...

  2. Go语言中的Struct

    一.Go语言中没有像C#.Java一样的Class,只有Struct这样的结构体.Go语言使用type关键字来定义一个类型. 如下: type User struct { Name string Ag ...

  3. Linux系统中硬链接和软链接(符号链接)的区别

    首先是创建链接的命令 ln file link //创建硬链接 ln -s item link //创建软链接 区别 硬链接 硬链接是一开始Unix创造链接的方式,而软连接就更现代一点.创建硬链接的时 ...

  4. STS搭建SpringBoot项目

    开发工具:推荐IDEA . Spring Tool Suit 虽然很简单,但还是记录一下,图个热闹. 开始 >>> 1. File --> New --> Spring ...

  5. Tomcat系列(11)——Tomcat 部署web应用的4种方法

    核心内容 1.在Tomcat中有四种部署Web应用的方式,分别是: (1)利用Tomcat自动部署(项目直接拷贝OR WAR包拷贝 到webapps下) (2)利用控制台进行部署(tomcat的man ...

  6. LinkedBlockingQueue阻塞队列详解

    主要api java.util.concurrent包下的新类.LinkedBlockingQueue就是其中之一,是一个阻塞的线程安全的队列,底层采用链表实现.        LinkedBlock ...

  7. DirectX11 With Windows SDK--24 Render-To-Texture(RTT)技术的应用

    前言 尽管在上一章的动态天空盒中用到了Render-To-Texture技术,但那是针对纹理立方体的特化实现.考虑到该技术的应用层面非常广,在这里抽出独立的一章专门来讲有关它的通用实现以及各种应用. ...

  8. ClassLoader那事儿

    ClassLoader是什么 ClassLoader中文类加载器,java编写出来的是.java文件,然后编译成.class文件,而ClassLoader就是把class文件加载到jvm内存中:但jv ...

  9. $refs的用法及作用

    获取DOM元素,一般用document.querySelector获取这个dom节点,然后在获取input的值 但是用ref绑定之后,就不需要在获取dom节点了,直接在上面的input上绑定input ...

  10. 【DirectX12】第六章-练习

    练习3. (a) //LINELIST std::array<VPosData, > posData = { VPosData({ XMFLOAT3(-2.0f, -1.0f, +1.0f ...