spring中的autoconfigure包中定义了大量的条件注解condition,在spring-boot 和spring-cloud中有大量的应用,这些条件注解主要用于控制配置类和bean初始化条件。下面我们就来简单了解下这些条件注解的使用场景。这些条件注解可以放在类上也可以放在方法上
@ConditionalOnBean
判断指定的bean是否存在,如果存在就在执行下面的操作;使用示例:
@Configuration
public class MyConfiguration {
// 只有存在Demo2的bean才会加载下面的这个代码
@Bean
@ConditionalOnBean(Demo2.class)
public Demo1 demo1() {
return new Demo2();
}
}
注意如果Demo2的bean创建方式也是在@Configuration中实现那么可能会发生不生效的问题
@ConditionalOnClass
判断当前classpath下是否存在指定类,如果存在就执行下面的操作。比如spring-boot中自动装配对应的组件时(数据库这些)就是通过判断引入的类是否存在才决定是否加载。
@ConditionalOnClass(name = "feign.hystrix.HystrixFeign")
protected static class HystrixFeignTargeterConfiguration {
@Bean
@ConditionalOnMissingBean
public Targeter feignTargeter() {
return new HystrixTargeter();
}
}
@ConditionalOnMissingBean
和 @ConditionalOnBean 注解相反,当容器中没有指定的 Bean 才开启配置。
@ConditionalOnMissingClass
和 @ConditionalOnClass 注解相反,当容器中没有指定的 Class 才开启配置。
@ConditionalOnProperty
当指定的属性有指定的值时才开启配置。
...
@ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true)
protected static class HttpClientFeignConfiguration {
...
}
@ConditionalOnResource
当类路径下有指定的资源才开启配置。
@ConditionalOnSingleCandidate
当指定的 class 在容器中只有一个 Bean,或者同时有多个但为首选时才开启配置。
@ConditionalOnNotWebApplication
当前项目类型是 WEB 项目才开启配置。
@ConditionalOnCloudPlatform
这个注解几乎不使用,它表示只有运行在指定的云平台上才加载指定的 bean。支持的值是一个枚举类 CloudPlatform。
@ConditionalOnExpression
通过SpEL 表达式来决定是否启用。
@ConditionalOnJava
当运行的 Java JVM 在指定的版本范围时才开启配置。