目录
springboot 提供的 @Conditional 系列注解:校验是否满足指定条件,满足指定条件时 标注的@Component体系、@Bean注解才会创建对应的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个注解的属性、使用方式完全一样。
我们在用@Bean、@Component之类的注解配置bean时,可以加上@ConditionalOnMissingBean(Xxx.class) ,以避免重复创建bean。
@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 形式的类名都可以使用短类名,否则要使用全限定类名