@ConditionalOnProperty注解使用

需求

做一个工具包供其他项目使用,有时候项目不需要使用该工具,可以通过配置文件配置取消使用,而不用去修改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属性,用来指定如果配置文件中未进行对应属性配置时的默认处理:默认情况下matchIfMissingfalse,也就是说如果未进行属性配置,则自动配置不生效。如果matchIfMissingtrue,则表示如果没有对应的属性配置,则自动配置默认生效。

再看name属性,name用来从配置文件中读取某个属性值。在matchIfMissingfalse时,如果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.enabledhavingValue相等,也就是true时,该配置类才会生效,下面的两个bean才会注入。matchIfMissing = true表示如果没有配置my.interceptor.enabled则该配置类自动生效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值