ConfigurationProperties配置绑定

  • Post author:
  • Post category:其他


在 SpringBoot 项目中,获取配置属性可以说是一个非常简单的事情,将配置写在application.yml文件后,我们就可以直接通过

@Value

注解来绑定并获取;此外我们也可以将一个结构化的配置,借助

@ConfigurationProperties

绑定到一个POJO,然后供项目使用。

一、ConfigurationProperties 详解

1、配置绑定


配置类CheckCpuMemUseConf:

@ConfigurationProperties(prefix = "checkcpumemuseconf")
@Data
public class CheckCpuMemUseConf {
    public String checkCpuMemUse;
    public double lc2022CpuUse;
    public int lc2022CpuUseTimeOut;
    public int lc2022TimeOut;
    public double tidefingerCpuUse;
    public int tidefingerCpuUseTimeOut;
    public int tidefingerTimeOut;
    public double curlCpuUse;
    public int curlTimeOut;
    public double nmapCpuUse;
    public int nmapTimeOut;
    public double nodeCpuUse;
    public int nodeTimeOut;
    public double wappalyzerCpuUse;
    public int wappalyzerCpuUseTimeOut;
    public int wappalyzerTimeOut;
}

prefix = “checkcpumemuseconf”,会读取配置文件中,前缀为checkcpumemuseconf的属性,然后依次赋值到这个类中。


对应的配置文件:application.yaml

checkcpumemuseconf:
  checkCpuMemUse: ps -eo pid,command,pcpu,pmem,etime
  ###
  # 如果值<=0,则不进行进程检查,timeout以s为单位
  # cpuUse和timeOut 分开进行检查
  # cpuUseTime是在cpuUse超限的前提下进行检查
  ###
  lc2022CpuUse: 100
  #超过cpu使用量的超时时间
  lc2022CpuUseTimeOut: 0
  #超时时间
  lc2022TimeOut: 3600
  tidefingerCpuUse: 100
  #超过cpu使用量的超时时间
  tidefingerCpuUseTimeOut: 120
  #超时时间
  tidefingerTimeOut: 600
  curlCpuUse: 50
  #超时时间
  curlTimeOut: 60
  nmapCpuUse: 50
  #超时时间
  nmapTimeOut: 60
  nodeCpuUse: 50
  #超时时间
  nodeTimeOut: 60
  wappalyzerCpuUse: 100
  #超过cpu使用量的超时时间
  wappalyzerCpuUseTimeOut: 60
  #超时时间
  wappalyzerTimeOut: 600



注意事项

1、配置类必须有公共的 Setter 方法,上文中主要是借助 lombok的@Data,省略了 Setter 方法的显示声明而已;

2、类的属性名与配置文件中的配置名要求匹配

3、配置类不要求必须是 public

4、

prefix命名规范只能使用:小写字母、数字、下划线作为合法字符,另外”-“能被识别忽略。

2、注册生效


(1)@Component等注解修饰方式

直接在配置类上添加@Component



@Configuration等注解,让 Spring 容器扫描并加载它。

@Configuration
@ConfigurationProperties(prefix = "checkcpumemuseconf")
@Data
public class CheckCpuMemUseConf {
}

使用这种方式时,需要注意配置类在自动扫描的包路径下,否则可能不会被扫描(主要是作为第三方 jar 包提供服务时,可能出现扫描不到的问题)。


(2)Bean注册

把它当成一个普通的 bean,借助 bean 注册的方式来实现,也是一个可选的方案,一般的实现方式如下:

@Configuration
public class AutoConfiguration {
    @Bean
    public CheckCpuMemUseConf checkCpuMemUseConf () {
        return new CheckCpuMemUseConf ();
    }
}


(3)@EnableConfigurationProperties方式

在配置类上,添加这个注解之后,可以实现配置注册,一般常见的使用方式如下:

@EnableConfigurationProperties({CheckCpuMemUseConf.class})
@Configuration
public class AutoConfiguration {
}

3、参数类型不匹配

如果我们在配置中,一个本来希望接收 int 类型的参数,结果实际上填了一个非整形。

比如:将age设置为18y,测试将会 参数异常之后,直接启动失败,如果对参数的要求没有那么严格,即允许失败,我们可以通过设置ignoreInvalidFields = true


@Data
@ConfigurationProperties(prefix = "checkcpumemuseconf", ignoreInvalidFields = true)
public class CheckCpuMemUseConf{
}

再次执行测试,age=null,因为age传入的参数非法,所以是 null。

可在配置类中设置属性的默认值,表示当这个配置不存在或者设置非法时,使用默认的配置。

private Integer age = 18;

4、配置解析规则



(1)POJO、List、Map参数类型

Pwd类

@Data
public class Pwd {
    private String user;

    private String pwd;

    private Integer code;
}

扩展后的BindConfig配置类:

@Data
@ConfigurationProperties(prefix = "hhui.bind", ignoreInvalidFields = true)
public class BindConfig {

    private String name;

    private Integer age = 18;

    private List<String> list;

    private Map<String, String> map;

    private Pwd mainPwd;
}

mainPwd对应的yaml配置文件:

hhui:
  bind:
    Name: XXXXXXX
    AGE: 1h
    list:
      - java
      - c
      - python
    map:
      wechat: XXXXXXXwechat
      blogs: XXXXXXXblogs
      git: XXXXXXXgit
    # 下面这个对应的是 BindConfg.mainPwd; 可以写成 main_pwd也可以写成mainPwd
    main_pwd:
      user: XXXXXXX
      pwd: XXXXXXX
      code: 9



(2)自定义配置解析

hhui:
  bind:
    Jwt: '{"token": "11111", "timestamp": 1610880489123}'

对应的 Jwt 类如下:

@Data
public class Jwt {
    private String token;

    private Long timestamp;
}

这个时候如想实现上面的配置解析,可以通过实现

org.springframework.core.convert.converter.Converter

接口来支持,并通过

@ConfigurationPropertiesBinding,


注解来表明这是个配置属性转换类,不加这个注解会不生效。

@Component
@ConfigurationPropertiesBinding
public class JwtConverter implements Converter<String, Jwt> {
    @Override
    public Jwt convert(String source) {
        return JSONObject.parseObject(source, Jwt.class);
    }
}

5、参数校验

参数校验可以说比较常用的 case 了,比如前面的配置age,不会允许这个参数能是负数,如需要对参数进行校验,我们可以借助@Validated来实现校验。

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>
@Data
@Validated
@ConfigurationProperties(prefix = "hhui.bind", ignoreInvalidFields = true, ignoreUnknownFields = false)
public class BindConfig {
    @Min(13)
    @Max(66)
    private Integer age = 18;
}

参考网址:

【Spring Boot基础系列】ConfigurationProperties 配置绑定中那些你不知道的事情 – 墨天轮



版权声明:本文为inexaustible原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。