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

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

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

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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐