zoukankan      html  css  js  c++  java
  • @ConditionalOnProperty控制@Configuration是否生效

    在网上查询@ConditionalOnProperty的使用的时候,发现好多类似的文章,但是例子都不够全面。这里记录下测试示例,方便自己记忆。

    1、简介

       SpringBoot通过@ConditionalOnProperty来控制@Configuration是否生效

    2、说明

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ ElementType.TYPE, ElementType.METHOD })
    @Documented
    @Conditional(OnPropertyCondition.class)
    public @interface ConditionalOnProperty {
    
        String[] value() default {}; //数组,获取对应property名称的值,与name不可同时使用  
      
        String prefix() default "";//property名称的前缀(最后一个属性前的一串。比如aaa.bbb.ccc,则prefix为aaa.bbb),可有可无  
      
        String[] name() default {};//数组,property完整名称或部分名称(可与prefix组合使用,组成完整的property名称),与value不可同时使用  
      
        String havingValue() default "";//可与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置  
      
        boolean matchIfMissing() default false;//缺省配置。配置文件没有配置时,表示使用当前property。配置文件与havingValue匹配时,也使用当前property
      
        boolean relaxedNames() default true;//是否可以松散匹配,至今不知道怎么使用的  
    }

    3、单个示例

     a、建立一个Configuration配置类:

    @Data
    @Configuration
    @ConditionalOnProperty(value = "test.conditional", havingValue = "abc")
    public class TestConfiguration {
    
        /** 默认值 */
        private String field = "default";
    
    }

     b、建立一个测试类:

    @RestController
    @RequestMapping("test")
    public class TestController {
    
        @Autowired(required = false)
        private TestConfiguration test1Configuration;
    
        @GetMapping("testConfiguration")
        public String testConfiguration() {
            if (test1Configuration != null) {
                return test1Configuration.getField();
            }
            return "OK";
        }
    
    }

    c、配置文件application.yml:

    test:
      conditional: abc

     d、通过postman或者其它工具发送请求。结果如下:

    default

    以上表明TestConfiguration配置文件生效了

    4、多种示例

    接下来,改变@ConditionalOnProperty中的各个属性,然后通过查看返回结果来判断TestConfiguration是否生效。

    1、不配置@ConditionalOnProperty,直接生效。

    2、只有value属性,没有havingValue属性。如果application.yml配置了test.conditional则生效,否则不生效。

    @ConditionalOnProperty(value = "test.conditional")
    test:
      conditional: edf

    3、prefix + name相当于value属性(两者不可同时使用)。如果application.yml配置了test.conditional则生效,否则不生效

    @ConditionalOnProperty(prefix = "test", name = "conditional")
    test:
      conditional: edf

    4、name属性为一个数组,当要匹配多个值时,如果application.yml的配置与name属性中的值一一匹配则生效,否则不生效

    @ConditionalOnProperty(prefix = "test", name = { "conditional", "other" })
    test:
      conditional: abc
      other: edf

    5、当matchIfMissing=true时:

     a、如果application.yml配置了test.conditional则生效(此时matchIfMissing可有可无),否则不生效

     b、如果application.yml啥都没配置则生效

    @ConditionalOnProperty(prefix = "test", name = "conditional", matchIfMissing = true)

    6、加上havingValue属性。当havingValue的值与application.yml文件中test.conditional的值一致时则生效,否则不生效

    @ConditionalOnProperty(prefix = "test", name = "conditional", havingValue = "abc")
    test:
      conditional: abc

    7、加上havingValue属性。name属性为数组时,如果application.yml文件中配置了相关属性且值都一致时则生效,否则不生效

    @ConditionalOnProperty(prefix = "test", name = { "conditional", "other" }, havingValue = "abc")
    test:
      conditional: abc
      other: abc
  • 相关阅读:
    iOS真机调试 for Xcode 5
    iOS/iphone开发如何为苹果开发者帐号APPID续费
    unity3d中布娃娃系统
    U3D实现与iOS交互
    两种方法连接MySql数据库
    Unity3D Gamecenter 得分上传失败的处理
    Unity3.5 GameCenter基础教程(转载)
    判断数字正则表达式
    (转)SQL server 2005查询数据库表的数量和表的数据量
    C#操作PowerDesigner代码
  • 原文地址:https://www.cnblogs.com/xuwenjin/p/12603232.html
Copyright © 2011-2022 走看看