springboot:高级配置

164 阅读6分钟

高级配置

封装指定的 YAML 配置信息

这是最常用也是最实用的方法

  1. 在 yaml 中创建对象,并写入数据

  2. 定义数据模型封装 yaml 文件中对应的数据(实体类)

    数据模型的属性名一定要和yaml文件的属性名一致。它是用来接收配置信息的。

  3. 将数据模型注入 Spring 容器中(加上 @Component

  4. 将数据模型指向 yaml 文件里的指定对象(加上 @ConfigurationProperties(prefix = "对象"))。以后先写 yaml 配置文件,再写对应的数据模型。

相同颜色框起来的部分,请确保他们的一致性。

image-20220421232318922


配置第三方 bean

@EnableConfigurationProperties() 可以将使用的@ConfigurationProperties()注解对应的类加入 Spring 容器

【引导类】

@SpringBootApplication
@EnableConfigurationProperties(ServerConfig.class)
public class Springboot10ConfigrationApplication {
    
}

【数据模型】

//@Component
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
    private String ipAddress;
    private int port;
    private long timeout;
}

【配置】

servers:
  ipAddress: 192.168.0.1
  port: 2345
  timeout: -1

引导类通过@EnableConfigurationProperties() 找到对应的数据模型并将它放入 spring 容器里,数据模型通过@ConfigurationProperties()找到对应的配置并将数据填入。这样我们就可以用 spring 来管理所有的配置了。

这样子的好处就是能够统一管理。

【注意】@EnableConfigurationProperties() 不能和 @Component同时对一个数据模型使用,会起冲突。


松散绑定

  1. ConfigurationProperties绑定属性支持属性名宽松绑定

    image-20220428115802140

    在【配置文件中的这些属性】都可以被【数据模型的属性】识别。

  2. 使用 @Value(${配置文件属性名})的赋值方式是不支持松散绑定

    image-20220428120407986

    即括起来的部分必须一致

  3. 绑定前缀命名规则 —— 在 @ConfigurationProperties 的数据模型里,执行配置文件的名称必须按照格式规范:首字符英文,全部小写,使用 ‘-’ 和 ‘_’ 来分隔。

    image-20220428120628642

【总结】

  • 就是说,以后为了防止出错,在数据模型里都是用下划线写法 / 烤肉串写法 / 全部小写。
  • @Value不支持松散绑定,属性名请务必一致
  • 配置文件支持松散绑定,但是为了方便阅读请使用 下划线写法 / 烤肉串写法 / 标准常量 / 驼峰写法。

常用计量单位

jdk 8.0 提供了时间和空间的计量单位

  • 时间计量单位

    我们首先在数据模型里创建一个 Duration 类型属性,通过注解 @DurationUnit(ChronoUnit.计量单位)来选择时间计量单位

    // 设置时间单位
    @DurationUnit(ChronoUnit.MINUTES)
    private Duration serverTimeOut;
    

    将其放入配置文件中并给上值

    serverTimeOut: 3
    

    结果

    image-20220428123507564


    我们还可以不用注解直接在配置文件中为 Duration 类型属性直接赋值选择时间计量单位

    数据模型

    private Duration serverTimeOut;
    

    配置文件

    serverTimeOut: 3d
    

    结果

    image-20220428123955727

  • 空间计量单位

    我们首先在数据模型里创建一个 DataSize 类型属性,通过注解 @DataSizeUnit(DataUnit.空间计量单位)来选择空间计量单位

    // 设置空间单位
    @DataSizeUnit(DataUnit.GIGABYTES)
    private DataSize dataSize;
    

    通过配置文件为其赋上值

    dataSize: 1
    

    结果

    image-20220428124209290


    我们还可以不用注解直接在配置文件中为 DataSize 类型属性直接赋值选择空间计量单位

    数据模型

    private DataSize dataSize;
    

    配置文件

    dataSize: 1M
    

    结果

    image-20220428124435532

【总结】

  • 时间计量单位用 Duration 类型属性,通过注解 @DurationUnit(ChronoUnit.计量单位) 选择时间计量单位或在配置文件直接赋值选择时间计量单位
  • 空间计量单位用 DataSize 类型属性,通过注解 @DataSizeUnit(DataUnit.空间计量单位)选择空间计量单位或在配置文件直接赋值选择空间计量单位
  • 如果注解和直接赋值同时存在,会使用配置文件直接赋值的计量单位。

格式校验

  1. 导入 JSR303 格式校验作为校验器接口

            <!--1. 导入 JSR303 格式校验作为校验器接口 -->
            <dependency>
                <groupId>javax.validation</groupId>
                <artifactId>validation-api</artifactId>
            </dependency>
    
  2. 使用 Hibernate 框架提供的校验器做实现类

    <!--2. 使用 Hibernate 框架提供的校验器做实现类-->
    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
    </dependency>
    
  3. 注解@Validated开启对当前 bean 的属性注入校验

    @Validated
    public class ServerConfig {
    
    }
    
  4. 设置属性校验规则

    @Data
    @ConfigurationProperties(prefix = "servers")
    // 3. 开启对当前 bean 的属性注入校验
    @Validated
    public class ServerConfig {
        // 4. 设置属性校验规则
        @Max(value = 8888,message = "最大值不能超过 8888")
        private int port;
    }
    
    • 空和非空检查
      • @NotBlank:只能用于字符串不为 null ,并且字符串 .trim() 以后 length 要大于 0 。
      • @NotEmpty:集合对象的元素不为 0 ,即集合不为空 。
      • @NotNull:不能为 null 。
      • @Null:必须为 null 。
    • 数值检查
      • @DecimalMax(value):被注释的元素必须是一个数字,其值必须小于等于指定的最大值。
      • @DecimalMin(value):被注释的元素必须是一个数字,其值必须大于等于指定的最小值。
      • @Digits(integer, fraction):被注释的元素必须是一个数字,其值必须在可接受的范围内。
      • @Positive:判断正数。
      • @PositiveOrZero:判断正数或 0 。
      • @Max(value):该字段的值只能小于或等于该值。
      • @Min(value):该字段的值只能大于或等于该值。
      • @Negative:判断负数。
      • @NegativeOrZero:判断负数或 0 。
    • Boolean 值检查
      • @AssertFalse:被注释的元素必须为 true 。
      • @AssertTrue:被注释的元素必须为 false 。
    • 长度检查
      • @Size(max, min):检查字段的 size 是否在 min 和 max 之间,可以是字符串、数组、集合、Map 等。
    • 日期检查
      • @Future:被注释的元素必须是一个将来的日期。
      • @FutureOrPresent:判断日期是否是将来或现在日期。
      • @Past:检查该字段的日期是在过去。
      • @PastOrPresent:判断日期是否是过去或现在日期。
    • 其它检查
      • @Email:被注释的元素必须是电子邮箱地址。
      • @Pattern(value):被注释的元素必须符合指定的正则表达式。
  5. 测试结果

    • 配置文件设置端口为 80

      servers:
        port: 80
      

      image-20220428151933693

    • 配置文件设置端口为 9999

      servers:
        port: 9999
      

      image-20220428152126369

【总结】

  • 这些东西不一定要完成掌握,但是需要了解有这个做法。

进制数据转换规则

image-20220428153109920

当我们在日常开发的时候,在配置文件里的写入数据可能我们读出的数据有所不同。

image-20220428153408576

造成这样的结果是因为在配置文件中数字默认是用int类型来存储,而 0XXX 这种写法刚好满足了 8 进制的写法。

所以当我们输出 0123456 的时候配置文件自动帮我们将其转化成了 8 进制的 42798。为了避免这种string类型数据被自动转化成int类型来存储并且切好符合了其他进制的转化变成了一个其他进制的数据。我们在存储的时候最好使用 " "来将字符串括起来。

【总结】

  • 存储字符串的收用 " " 括起来