需求
做一个工具包供其他项目使用,有时候项目不需要使用该工具,可以通过配置文件配置取消使用,而不用去修改pom取消引入。
作用
控制Configuration是否生效
注解详情
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty {
//数组,获取对应property名称的值,与name不可同时使用
String[] value() default {};
//property名称的前缀,可有可无
String prefix() default "";
//数组,property完整名称或部分名称(可与prefix组合使用,组成完整的property名称),与value不可同时使用
String[] name() default {};
//可与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置
String havingValue() default "";
//缺少该property时是否可以加载。如果为true,没有该property也会正常加载;反之报错
boolean matchIfMissing() default false;
//是否可以松散匹配
boolean relaxedNames() default true;
}
通过注解@ConditionalOnProperty
上的@Conditional(OnPropertyCondition.class)
,可以看出@ConditionalOnProperty
属于@Conditional
的衍生注解。生效条件由OnPropertyCondition
来进行判断。
使用方法
@ConditionalOnProperty
的核心功能是通过属性name以及havingValue来实现的。
首先看matchIfMissing
属性,用来指定如果配置文件中未进行对应属性配置时的默认处理:默认情况下matchIfMissing
为false
,也就是说如果未进行属性配置,则自动配置不生效。如果matchIfMissing
为true
,则表示如果没有对应的属性配置,则自动配置默认生效。
再看name
属性,name
用来从配置文件中读取某个属性值。在matchIfMissing
为false
时,如果name
值为空,则返回false
;如果name
不为空,则将该值与havingValue
指定的值进行比较,如果一样则返回true
,否则返回false
。返回false
也就意味着自动配置不会生效。
案例
@Configuration
@ConditionalOnProperty(
name = {"my.interceptor.enabled"},
matchIfMissing = true,
havingValue = "true"
)
public class InterceptorConfig {
@Bean
@ConditionalOnMissingBean
public IOperInfo iOperInfo(){
return new DefaultOperInfoImpl();
}
@Bean
public Interceptor interceptor() {
return new StuffInterceptor();
}
}
只有当name
指定的my.interceptor.enabled
与havingValue
相等,也就是true
时,该配置类才会生效,下面的两个bean才会注入。matchIfMissing = true
表示如果没有配置my.interceptor.enabled
则该配置类自动生效。