转自: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为条件

posted on 2020-09-22 16:01  Sharpest  阅读(6769)  评论(0编辑  收藏  举报