@ConditionalOnMissingBean注解使用案例

前言

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

需求

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

@Configuration
public class InterceptorConfig {

    @Bean
    @ConditionalOnMissingBean(IOperInfo.class)
    public IOperInfo iOperInfo(){
        return new DefaultOperInfoImpl();
    }

}

@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;
}

@ConditionalOnBean和@ConditionalOnMissBean、@Conditional

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值