一.@ConditionalOnMissingBean:

先看下官方解释

从上图主要可以得到如下信息:

  • 仅当BeanFactory中已没有满足指定要求的Bean时才匹配
  • 当放置在@Bean方法上时,Bean类默认为工厂方法的返回类型:
  • 该条件只能匹配到目前为止已由应用程序上下文处理的Bean定义,因此,强烈建议仅在自动配置类上使用该条件。如果候选Bean可能是由另一个自动配置创建的,请确保使用此条件的Bean在之后运行。
    简单的说其实就是只有当BeanFactory中没有指定的bean的时候才能匹配,主要是用来做自动配置的,当程序没有配置指定的类的时候,就会使用默认配置
    用下面简单的例子说下
@Service
public class UserService implements InitializingBean {@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("1111111111111111");}
}
@Service
//当Bean工厂没有UserService的bean的话才创建UserService2的Bean
@ConditionalOnMissingBean(UserService.class)
public class UserService2 implements InitializingBean {@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("222222222");}
}

运行效果

只有11111111 ,UserService2 无法创建bean因为在创建UserService2 时 UserService已经创建了。
因此在使用@ConditionalOnMissingBean一定要确保使用此条件的Bean在之后运行。不然会失效请看以下情况

@Configuration
public class TestConfig {@Bean@ConditionalOnMissingBean(UserService.class)public UserService2 userService2() {return new UserService2();}@Bean@DependsOn("userService2")public UserService userService() {return new UserService();}
}

运行效果两个bean都被创建了

这里是因为 @DependsOn(“userService2”) 在加载UserService 必须先加载UserService2这样就导致 @ConditionalOnMissingBean(UserService.class)失效。

其它注释及总结:

  • @ConditionalOnBean // 当给定的在bean存在时,则实例化当前Bean
  • @ConditionalOnMissingBean // 当给定的在bean不存在时,则实例化当前Bean
  • @ConditionalOnClass // 当给定的类名在类路径上存在,则实例化当前Bean
  • @ConditionalOnMissingClass // 当给定的类名在类路径上不存在,则实例化当前Bean

@ConditionalOnMissingBean相关推荐

  1. @ConditionalOnMissingBean注解理解

    @ConditionalOnMissingBean注解作用在@bean定义上,它的作用就是在容器加载它作用的bean时,检查容器中是否存在目标类型(ConditionalOnMissingBean注解 ...

  2. ConditionalOnMissingBean失效问题追踪

    遇到一个@ConditionalOnMissingBean失效的问题,今天花点时间来分析一下. 现场回放 services 首先介绍下代码结构:有RunService,以及它的两个实现类:TrainR ...

  3. SpringBoot @ConditionalOnBean、@ConditionalOnMissingBean注解源码分析与示例

    前言: Spring4推出了@Conditional注解,方便程序根据当前环境或者容器情况来动态注入bean 继@Conditional注解后,又基于此注解推出了很多派生注解,比如@Condition ...

  4. ConditionalOnBean 与 ConditionalOnMissingBean 的正确玩法

    之前看到这篇博客,写ConditionalOnClass的用法,自己实践了一下,感觉有点问题,原文如下: https://blog.csdn.net/lucyTheSlayer/article/det ...

  5. 【springboot】入门

    简介: springBoot是spring团队为了整合spring全家桶中的系列框架做研究出来的一个轻量级框架.随着spring4.0推出而推出,springBoot可以説是J2SEE的一站式解决方案 ...

  6. 狂神Spring Boot 员工管理系统 超详细完整实现教程(小白轻松上手~)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  7. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  8. 1命名规则 sentinel_Spring Cloud Alibaba 整合 Sentinel 流控

    前面我们都是直接通过集成sentinel的依赖,通过编码的方式配置规则等.对于集成到Spring Cloud中阿里已经有了一套开源框架spring-cloud-alibaba,就是用于将一系列的框架成 ...

  9. Java - 框架之 SpringBoot 攻略day01

    Spring-Boot 攻略 day01 spring-boot 一. 基本配置加运行 1. 导入配置文件(pom.xml 文件中) <parent> <groupId>org ...

最新文章

  1. python代码转换为pytorch_python、PyTorch图像读取与numpy转换
  2. 单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)
  3. 计算机组成原理xchg,8088数据传送指令-计算机组成原理与汇编语言-电子发烧友网站...
  4. CF1039C Network Safety
  5. python socket服务器_记-python socket服务器端四部曲
  6. android 线程安全
  7. 我的2006年,我的博客站
  8. Python 中国慕课第五章测试 OpenJudge作业(包含通过码)
  9. Java 有序的Map —— LinkedHashMap
  10. 计算流体力学编程作业matlab,中科大计算流体力学CFD之大作业二.doc
  11. L298N电机驱动模块
  12. mock和spy的不同点
  13. 毕业设计结论计算机应用技术,计算机应用技术(网络、软件)毕业设计实施方案...
  14. 计算机桌面的文件拒绝访问,文件或文件夹拒绝访问的解决方法
  15. 百度地图API详解之自定义地图类型
  16. JavaScript将后端获取到的byte数组转为文件
  17. The page has expired due to inactivity. Please refresh and try again.
  18. 高级数据结构之赫夫曼树
  19. linux系统添加网卡驱动,linux系统怎么安装网卡驱动
  20. 硬盘检测工具+linux,linux硬盘检测工具:Smartmontools使用指南

热门文章

  1. 这也行?动手用Python做一个酒精检测仪,数据还能直接上云
  2. vue js数字转换成汉字展示
  3. 删除文件出现 数据错误 循环冗余的解决办法
  4. 3d bounding box 标注工具
  5. 基于汽车知识图谱的汽车问答多轮对话系统 详细教程
  6. IOS图标 HTML规范,最新iOS设计规范八|3大图标和图像规范(Icons and Images)
  7. 为何半导体芯片选择硅作为材料?
  8. 天祥电子proteus原理图c51+avr+pic
  9. Office 365 利用并行工作流构建威客式任务管理系统之使用SharePoint Designer 定制威客任务管理流程!
  10. 【editplus经常用的快捷键】Editplus 选中一行ctrl+r,Edit 合并行 Ctrl+Shift+J 合并选定行 删除当前行