> 文档中心 > @ConditionalOnProperty、@ConditionalOnBean 条件注解的使用

@ConditionalOnProperty、@ConditionalOnBean 条件注解的使用

Spring 中提供了多种条件注解以实现在满足特定条件的时候才向 Sping 容器中注入指定的 bean;Springboot 中自动配置的原理也是基于各种条件注解,当我们引入某个依赖导致满足了注入某些特定bean的条件,这些 bean 就会被自动注入 Spring 容器中供我们使用。

  • @ConditionalOnBean
    当指定的 Bean 存在时,则实例化当前 Bean。
  • @ConditionalOnMissingBean
    @ConditionalOnBean 相反,当指定的 Bean 不存在时,则实例化当前 Bean。
  • @ConditionalOnClass
    当指定的类名在类路径上存在时,则实例化当前 Bean。
  • @ConditionalOnMissingClass
    当指定的类名在类路径上不存在时,则实例化当前 Bean。

下面通过一个配置类,来完成在不同情况下使用阿里云 Oss 和 minioOss 对象存储服务的配置:

@Configurationpublic class OssConfiguration {@Bean    @ConfigurationProperties(prefix = "oss.aliyun")    @ConditionalOnProperty(value = "oss.aliyun.endPoint")    public AliyunOssProperties aliyunOssProperties() { return new AliyunOssProperties();    }    @Bean    @ConfigurationProperties(prefix = "oss.minio")    @ConditionalOnProperty(value = "oss.minio.endPoint")    public MinioOssProperties minioOssProperties() { return new MinioOssProperties();    } @Bean@ConditionalOnBean(value = AliyunOssProperties.class)public OssService aliyunOssConfig(AliyunOssProperties properties) {return new AliyunOssServiceImpl(properties);}@Bean@ConditionalOnBean(value = MinioOssProperties.class)public OssService minioOssService(MinioOssProperties properties) {return new MinioServiceImpl(properties);}}

@ConditionalOnProperty(value = "oss.aliyun.endPoint") 表示,当在配置文件 .properties 或 .yml 中配置属性 oss.aliyun.endPoint 时,Spring 就会加载 AliyunOssProperties。

进而 @ConditionalOnBean(value = AliyunOssProperties.class) 将会注入 OssService 的实现 AliyunOssServiceImpl。

相同的,如果配置文件中配置 oss.minio.endPoint,将会注入 OssService 的实现 MinioServiceImpl。