@ConditionalOnMissingBean注解使用案例


转自:https://blog.csdn.net/weixin_43993065/article/details/106740140

前言

继@Conditional注解后,又基于此注解推出了很多派生注解,比如@ConditionalOnBean、@ConditionalOnMissingBean、@ConditionalOnExpression、@ConditionalOnClass…动态注入bean变得更方便了。本篇将讲解@ConditionalOnMissingBean注解。

需求

做了一个功能接口提供给消费者实现,考虑到有些消费者没有实现接口,就会导致报错。所以需要写一个默认实现,并且在消费者有实现接口时,采用消费者的接口。

@Configuration public class InterceptorConfig { @Bean @ConditionalOnMissingBean(IOperInfo.class) public IOperInfo iOperInfo(){ return new DefaultOperInfoImpl(); } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

@ConditionalOnMissingBean就实现了这个功能,它作用在@bean定义上,就是在容器加载它作用的bean时,检查容器中是否存在目标类型(@ConditionalOnMissingBean注解的value值)的bean了,如果存在这跳过原始bean的默认加载动作。

注解分析

//可以标注在类和方法上 @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented //使用了@Conditional注解,条件类是OnBeanCondition @Conditional({OnBeanCondition.class}) public @interface ConditionalOnMissingBean { // 需要检查的 bean 的 class 类型。当 ApplicationContext 不包含每一个被指定的 class 时条件匹配。 Class<?>[] value() default {}; // 需要检查的 bean 的 class 类型名称。当 ApplicationContext 不包含每一个被指定的 class 时条件匹配。 String[] type() default {}; // 识别匹配 bean 时,可以被忽略的 bean 的 class 类型 Class<?>[] ignored() default {}; // 识别匹配 bean 时,可以被忽略的 bean 的 class 类型名称 String[] ignoredType() default {}; // 当 ApplicationContext 不包含带有这些注解的 bean 时条件匹配。 Class<? extends Annotation>[] annotation() default {}; // 需要检查的 bean 的 name。当 ApplicationContext 不包含任意指定的每一个的 class 时条件匹配。 String[] name() default {}; // 搜索容器层级,当前容器,父容器 SearchStrategy search() default SearchStrategy.ALL; } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

@ConditionalOnBean和@ConditionalOnMissBean、@Conditional

简单理解就是@ConditionalOnBean是依赖,@ConditionalOnMissBean是排斥,@Conditional为条件


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM