栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot @Conditional系列注解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot @Conditional系列注解

目录
      • @ConditionalOnClass、@ConditionalOnMissingClass
      • @ConditionalOnBean、@ConditionalOnMissingBean
      • @ConditionalOnSingleCandidate
      • @ConditionalOnWebApplication
      • @ConditionalOnProperty
      • 说明

 

springboot 提供了 @Conditional 系列注解用于校验 bean|组件 是否满足条件|匹配,满足|匹配时标注的@Component体系、@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个注解的属性、使用方式完全一样。

@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 形式的类名都可以使用短类名,否则要使用全限定类名
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/337683.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号