SpringBoot @Conditional系列注解


 

springboot 提供的 @Conditional 系列注解:校验是否满足指定条件,满足指定条件时 标注的@Component体系、@Bean注解才会创建对应的bean实例放到容器中。如果启动时报bean定义重复,可以考虑用 @Conditional 系列注解处理。

 

@ConditionalOnClass、@ConditionalOnMissingClass

指定的类存在|不存在(classpath中要有|没有指定的类)时,才会作为bean放到容器中。

这2个注解的属性、使用方式完全一样。

@Configuration
@ConditionalOnClass(A.class)  //classpath中存在A这个类时,@Configuration才会生效,才会把当前类作为bean放到容器中
public class SysConfig {

    @Bean
    @ConditionalOnClass(B.class)  //classpath中存在B这个类时,@Bean才会生效,才会把方法返回值作为bean放到容器中
    public SysService userserService() {
        return new SysService();
    }

}

类可以用value属性指定,Class<?>[ ] 形式;也可以用name属性指定,String[ ] 形式。

 

@ConditionalOnBean、@ConditionalOnMissingBean

容器中有|没有指定的bean时,才会作为bean放到容器中。这2个注解的属性、使用方式完全一样。

我们在用@Bean、@Component之类的注解配置bean时,可以加上@ConditionalOnMissingBean(Xxx.class) ,以避免重复创建bean。

@Configuration
@ConditionalOnMissingBean(A.class)  //容器中有|没有A这个bean时...
public class SysConfig {

    @Bean
    @ConditionalOnProperty(B.class)  //容器中有|没有B这个bean时...
    public SysService userserService() {
        return new SysService();
    }

}

容器中缺少的bean可以用以下任意一个属性指定

  • value属性:Class[ ] 形式
  • type属性:String[ ] 形式,类名
  • name属性:String[ ] 形式,beanName

 

@ConditionalOnSingleCandidate

指定的bean已经存在于容器中,且只有单个实例(单个候选者)时,才会作为bean放到容器中。

@ConditionalOnSingleCandidate 是 @ConditionalOnBean 的一种情况,满足前者时一定满足后者,满足后者时不一定满足前者。

@Configuration
@ConditionalOnSingleCandidate(A.class)  //A这个bean已经存在于容器中,且只有单个实例时...
public class SysConfig {

    @Bean
    @ConditionalOnSingleCandidate(B.class)  //B这个bean已经存在于容器中,且只有单个实例时...
    public SysService userserService() {
        return new SysService();
    }

}

可以用value属性指定,Class[ ] 形式;也可以用type属性指定,String[ ] 形式。

 

@ConditionalOnWebApplication

要是指定的web应用类型,才会作为bean放到容器中

@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)  //web应用类型是reactive应用时...
public class SysConfig {

    @Bean
    @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)  //web应用类型是servlet应用时...
    public SysService userserService() {
        return new SysService();
    }

}

type指定应用类型,默认值 ANY,表示可以是任何web应用类型。

 

@ConditionalOnProperty

yml | properties 配置文件中配置的属性满足要求时,才会作为bean放到容器中

@Configuration
@ConditionalOnProperty("spring.profiles.active")  //yml | properties 中配置了 spring.profiles.active 这个属性时...
public class SysConfig {

    @Bean
    @ConditionalOnProperty("spring.profiles.include")  //yml | properties 中配置了 spring.profiles.include 这个属性时...
    public SysService userserService() {
        return new SysService();
    }

}

常用属性,均可选

  • name、value:互为别名,指定配置项名称,String[ ] 形式
  • prefix:指定配置项前缀,指定了前缀时 name|value 属性可以只写后面部分
  • havingValue:指定期待的值,String 形式

 

说明

对于 @Conditional 系列注解

  • 因为是校验@Component系列、@Bean的满足条件,所有都可以标注在类上校验 @Component 系列注解的有效性,或者标注在方法上校验 @Bean 的有效性。
  • 如果参数值是数组形式,则要满足全部元素才算满足、匹配
  • 在类名可以区分的情况下,Class、String 形式的类名都可以使用短类名,否则要使用全限定类名
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值