@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。