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