之前看到这篇博客,写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. C语言博客作业02--循环结构

    1.本章学习总结 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 经过本周学习,对c循环结构有了深入,无论是单层循环结构还是嵌套循环结构的问题,我都学会有一定的解决能力, ...

  2. 关于TVWALL 通过AS300获取状态连接失败

    昨天晚会突然之间频繁出现tvwall视频软件,断开AS300管理软件的故障 发现AS300当中的cms服务进程,占用内存250M左右,一般情况下估计就是50M左右,增长了不少 无奈之下,只有重启AS3 ...

  3. logback输出json格式日志(包括mdc)发送到kafka

    1,pom.xml <!-- kafka --> <dependency> <groupId>com.github.danielwegener</groupI ...

  4. 面向对象编程(OPP)

    作者:狐狸家的鱼 本文链接:面向对象编程 GitHub:sueRimn 面向对象编程(OPP) 具有灵活.代码可复用.高度模块化等特点,易维护和开发 实例对象与new命令 1.对象 对象是单个实物的抽 ...

  5. bzoj4490 随机数生成器Ⅱ加强版

    题目链接 题意 给出参数\(C_1,C_2,P\)按如下方式生成一个长度为\(n \times m\)的序列\(x\): \(x_0 = C_1,x_1=C2\) \(x_i=(x_{i-1}+x_{ ...

  6. elasticsearch中head插件中的定制增加用户名密码范例

    在head插件目录下一般 在 elasticsearch目录下的 plugins\head目录 下 在 或 plugins\head\site目录下 有 一个index.html文件.把这个文件用下面 ...

  7. 使用BeautifulSoup

    下载bs4,导入BeautifulSoup pip install bs4 from bs4 import BeautifulSoup BeautifulSoup 的使用 创建对象 r = reque ...

  8. 基于 Markdown 编写接口文档

    最近公司开发项目需要前后端分离,这样话就设计到后端接口设计.复杂功能需要提供各种各样的接口供前端调用,因此编写API文档非常有必要了 网上查了很多资料,发现基于Markdown编写文档是一种比较流行而 ...

  9. The 19th Zhejiang University Programming Contest - H

    Princess Cjb is caught by Heltion again! Her knights Little Sub and Little Potato are going to Helti ...

  10. Java发布webservice应用并发送SOAP请求调用

    webservice框架有很多,比如axis.axis2.cxf.xFire等等,做服务端和做客户端都可行,个人感觉使用这些框架的好处是减少了对于接口信息的解析,最主要的是减少了对于传递于网络中XML ...