@ConditionalOnMissingBean
一.@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相关推荐
- @ConditionalOnMissingBean注解理解
@ConditionalOnMissingBean注解作用在@bean定义上,它的作用就是在容器加载它作用的bean时,检查容器中是否存在目标类型(ConditionalOnMissingBean注解 ...
- ConditionalOnMissingBean失效问题追踪
遇到一个@ConditionalOnMissingBean失效的问题,今天花点时间来分析一下. 现场回放 services 首先介绍下代码结构:有RunService,以及它的两个实现类:TrainR ...
- SpringBoot @ConditionalOnBean、@ConditionalOnMissingBean注解源码分析与示例
前言: Spring4推出了@Conditional注解,方便程序根据当前环境或者容器情况来动态注入bean 继@Conditional注解后,又基于此注解推出了很多派生注解,比如@Condition ...
- ConditionalOnBean 与 ConditionalOnMissingBean 的正确玩法
之前看到这篇博客,写ConditionalOnClass的用法,自己实践了一下,感觉有点问题,原文如下: https://blog.csdn.net/lucyTheSlayer/article/det ...
- 【springboot】入门
简介: springBoot是spring团队为了整合spring全家桶中的系列框架做研究出来的一个轻量级框架.随着spring4.0推出而推出,springBoot可以説是J2SEE的一站式解决方案 ...
- 狂神Spring Boot 员工管理系统 超详细完整实现教程(小白轻松上手~)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...
- SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...
- 1命名规则 sentinel_Spring Cloud Alibaba 整合 Sentinel 流控
前面我们都是直接通过集成sentinel的依赖,通过编码的方式配置规则等.对于集成到Spring Cloud中阿里已经有了一套开源框架spring-cloud-alibaba,就是用于将一系列的框架成 ...
- Java - 框架之 SpringBoot 攻略day01
Spring-Boot 攻略 day01 spring-boot 一. 基本配置加运行 1. 导入配置文件(pom.xml 文件中) <parent> <groupId>org ...
最新文章
- python代码转换为pytorch_python、PyTorch图像读取与numpy转换
- 单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)
- 计算机组成原理xchg,8088数据传送指令-计算机组成原理与汇编语言-电子发烧友网站...
- CF1039C Network Safety
- python socket服务器_记-python socket服务器端四部曲
- android 线程安全
- 我的2006年,我的博客站
- Python 中国慕课第五章测试 OpenJudge作业(包含通过码)
- Java 有序的Map —— LinkedHashMap
- 计算流体力学编程作业matlab,中科大计算流体力学CFD之大作业二.doc
- L298N电机驱动模块
- mock和spy的不同点
- 毕业设计结论计算机应用技术,计算机应用技术(网络、软件)毕业设计实施方案...
- 计算机桌面的文件拒绝访问,文件或文件夹拒绝访问的解决方法
- 百度地图API详解之自定义地图类型
- JavaScript将后端获取到的byte数组转为文件
- The page has expired due to inactivity. Please refresh and try again.
- 高级数据结构之赫夫曼树
- linux系统添加网卡驱动,linux系统怎么安装网卡驱动
- 硬盘检测工具+linux,linux硬盘检测工具:Smartmontools使用指南
热门文章
- 这也行?动手用Python做一个酒精检测仪,数据还能直接上云
- vue js数字转换成汉字展示
- 删除文件出现 数据错误 循环冗余的解决办法
- 3d bounding box 标注工具
- 基于汽车知识图谱的汽车问答多轮对话系统 详细教程
- IOS图标 HTML规范,最新iOS设计规范八|3大图标和图像规范(Icons and Images)
- 为何半导体芯片选择硅作为材料?
- 天祥电子proteus原理图c51+avr+pic
- Office 365 利用并行工作流构建威客式任务管理系统之使用SharePoint Designer 定制威客任务管理流程!
- 【editplus经常用的快捷键】Editplus 选中一行ctrl+r,Edit 合并行 Ctrl+Shift+J 合并选定行 删除当前行