@ConditionalOnProperty注解使用

Posted 唐宋xy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@ConditionalOnProperty注解使用相关的知识,希望对你有一定的参考价值。

在日常的开发中,经常遇到当某些条件不满足是不加载bean或者在某一段时间不加载某些配置,或者在不同的机房中使用不同的配置,那么就需要控制这个bean在不同的条件下是否需要加载,那么这个时候就需要根据配置或者某些条件来控制配置是否启用。那么如何控制spring的bean,@ConditionalOnProperty注解会告诉你

@ConditionalOnProperty注解

  • 作用

    在Spring Boot的自动配置中经常看到@ConditionalOnProperty注解的使用,这个注解就是控制在指定的条件下,是否需要加载这个bean

  • 属性说明

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ ElementType.TYPE, ElementType.METHOD })
    @Documented
    @Conditional(OnPropertyCondition.class)
    public @interface ConditionalOnProperty {
    
        // 数组,获取对应property名称的值,与name不可同时使用
        String[] value() default {};
    
        // 配置属性名称的前缀,比如spring.http
        String prefix() default "";
    
        // 数组,配置属性完整名称或部分名称
        // 可与prefix组合使用,组成完整的配置属性名称,与value不可同时使用
        String[] name() default {};
    
        // 获取配置文件中key为name属性的值,比较该值与havingValue给定的值是否相同,相同才加载配置
        String havingValue() default "";
    
        // 如果为true,没有该配置属性时也会正常加载;反之则不会生效,表示配置文件中如果没有name属性配置的key
        boolean matchIfMissing() default false;
    
    }
    
  • 使用范围

    在指定的class或者method都可以使用

    image-20210529213710339

    可以看到,注解的@Target属性值为TypeMETHOD,就表示当前注解在类和方法上都可以使用。

  • 使用方式

    直接在@Configuration@Bean上同级进行使用,如果满足条件就表示可以加载该类,如果不满足条件就不加载这个bean到Spring容器中

    @Configuration
    @ConditionalOnProperty(name = "enable.user.config", havingValue = "true")
    public class UserInfoConfig {
        
        @Bean(name = "USER_LOAD")
        @ConditionalOnProperty(name = "enable.user.bean", havingValue = "true")
        public User user() {
          	User user = new User();
            return user;
        }
    
    }
    

    上面的配置使用了@ConditionalOnProperty注解,那么表示如果配置文件中key为load.user.bean的值如果是havingValue的值(即true),那么就表示加载这个配置类和Bean,如果为false或者没有配置这个key,默认也是false,即不加载这个配置。

    这样通过这个注解,就可以控制在指定的条件下,灵活的配置是否需要加载某些配置,将配置和硬编码进行解耦,提高灵活性和扩展性。

apollo配置踩坑

如果需要将@ConditionalOnProperty(name = "enable.user.config", havingValue = "true")中的enable.user.config配置到apollo中,那么有点小问题需要注意,否则配置之后不生效

  • 增加apollo配置

    在项目本地目录下的application.properties中增加apollo.bootstrap.enabled = true配置

  • 配置命令空间

    如果需要将enable.user.config配置在apollo配置中心,方便管理和热更新,那么不能配置到其他的namespace中,需要配置在项目的applicationnamespace才可以生效。

以上是关于@ConditionalOnProperty注解使用的主要内容,如果未能解决你的问题,请参考以下文章

springboot注解使用

spring学习笔记

详解Spring Boot框架中的@Conditional系列注解

详解Spring Boot框架中的@Conditional系列注解

@ConditionalOnProperty 注释的目的是啥?

@Profile 与 @ConditionalOnProperty