美文网首页
SpringBoot配置管理

SpringBoot配置管理

作者: liushiping | 来源:发表于2023-06-18 16:13 被阅读0次

    一.SpringBoot配置文件及语法

    1.1 SpringBoot全局配置文件

    SpringBoot使用一个全局的配置文件,配置文件名是固定的:

    • application.properties
    • application.yml

    全局配置文件的作用:修改SpringBoot自动配置的默认值,通过配置来影响SpringBoot自动加载行为。新建项目后的全局文件默认为application.properties,但我推荐使用application.yml。它是一种数据序列化语言,通过一定的格式表示数据结构。由于其良好的数据结构表现能力,既方便程序处理,也方便程序员阅读,所以其常常被用于书写配置文件。

    1.2YAML文件语法

    book:
      book-name: SpringBoot2实战第二版
      author-name: William
      price: 99
      publisher:
        name: 电子工业出版社
        alias:
          - 电工社
    
    publish-year: 2022
    

    配置对应的Java类如下:

    public class Book {
        private String bookName;
        private String authorName;
        private Float price;
        private Publisher publisher;
    
        @Data
        public static class Publisher {
            private String name;
            private List<String> alias;
        }
    }
    

    二.YAML配置绑定变量两种方式

    2.1 使用@Value获取配置值

    通过@Value注解将publish-year属性的值绑定到year成员变量上面。

    @Component
    public class Book {
    
        @Value("${publish-year}")
        private Integer year;
    }
    

    2.2 使用@ConfigurationProperties获取配置值

    对于1.2节中的配置文件,可以通过@ConfigurationProperties注解获取配置信息并对的Java类属性进行赋值。

    @Data
    @ToString
    @Component
    //prefix = "book"表示配置的整体前缀为book
    @ConfigurationProperties(prefix = "book")
    public class Book {
        private String bookName;
        private String authorName;
        private Float price;
        private Publisher publisher;
    
        @Data
        public static class Publisher {
            private String name;
            private List<String> alias;
        }
    }
    

    2.3两者的区别

    @ConfigurationProperties @Value
    功能 批量注入属性到java类 一个个属性指定注入
    松散语法绑定 支持 不支持
    复杂数据类型(对象、数组) 支持 不支持
    JSR303数据校验 支持 不支持
    SpEL 不支持 支持

    三.配置属性值数据绑定校验

    为了避免人为配置出错的可能,我们通常对配置属性与类对象的成员变量绑定的时候,就加上一些校验规则。如果配置值不符合校验规则,在应用程序在启动的时候就会抛出异常。

    3.1 对绑定的属性值进行校验

    首先需要将校验类库依赖进入项目:

    <dependency>
       <groupId>org.hibernate</groupId>
       <artifactId>hibernate-validator</artifactId>
       <version>5.2.4.Final</version>
    </dependency>
    

    校验规则注解是在JSR 303(java)规范中定义的,但是JSR 303只是一个规范,并没有很多比较具体的实现。目前通常都是使用hibernate-validator进行统一参数校验,hibernate-validator是对JSR 303规范的实现。

    其次在需要校验的属性装配类上加@Validated注解,最后在需要校验的字段上加上相应的校验注解即可。

    @Data
    @ToString
    @Component
    //prefix = "book"表示配置的整体前缀为book
    @ConfigurationProperties(prefix = "book")
    @Validated
    public class Book {
        private String bookName;
        @NotEmpty(message = "作者不能为空")
        private String authorName;
        @Min(value = 1, message = "价格不能小于1元")
        @Max(value = 100, message = "价格不能大于100元")
        private Float price;
        @Min(value = 2016, message = "年份不能小于2016")
        @Value("${book-year}")
        private Integer year;
        private Publisher publisher;
    
        @Data
        public static class Publisher {
            private String name;
            private List<String> alias;
        }
    }
    

    3.2 当校验失败的时候抛出异常

    上面的代码中,message用于在校验失败时提示校验失败原因。实际上这些校验注解不仅可以校验配置属性值,也可以校验HTTP请求参数值。

    3.3 常用校验注解

    限制 说明
    @Null 限制只能为null
    @NotNull 限制必须不为null
    @AssertFalse 限制必须为false
    @AssertTrue 限制必须为true
    @DecimalMax(value) 限制必须为一个不大于指定值的数字
    @DecimalMin(value) 限制必须为一个不小于指定值的数字
    @Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
    @Future 限制必须是一个将来的日期
    @Max(value) 限制必须为一个不大于指定值的数字
    @Min(value) 限制必须为一个不小于指定值的数字
    @Past 限制必须是一个过去的日期
    @Pattern(value) 限制必须符合指定的正则表达式
    @Size(max,min) 限制字符长度必须在min到max之间
    @Past 验证注解的元素值(日期类型)比当前时间早
    @NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
    @NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
    @Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

    四.profile不同环境使用不同配置

    我们开发的服务通常会部署在不同的环境中,例如开发环境、测试环境,生产环境等,而不同环境需要不同的配置。最典型的场景就是在不同的环境下需要连接不同的数据库,需要使用不同的数据库配置。我们期待实现的配置效果是:

    • 减少配置修改次数
    • 方便环境配置切换

    4.1配置文件规划

    Spring Boot 默认的配置文件是 application.properties(或yml),一个比较好的实践是为不同的环境定义不同的配置文件:

    • 全局配置文件:application.yml
    • 开发环境配置文件:application-dev.yml
    • 测试环境配置文件:application-test.yml
    • 生产环境配置文件:application-prod.yml

    4.2切换环境的方式

    1.使用spring.profiles.active切换

    application.yml是默认使用的配置文件,在其中通过spring.profiles.active设置使用哪一个配置文件,下面代码表示使用application-dev.yml配置,如果application-dev.yml和application.yml配置了相同的配置,比如都配置了运行端口,那application-dev.yml的优先级更高。

    spring:
      profiles:
        active: dev
    
    2.使用系统属性切换

    VM options设置启动参数 -Dspring.profiles.active=dev
    java -jar spring-boot-demo.jar -Dspring.profiles.active=dev

    3.使用应用程序参数切换

    Program arguments设置 --spring.profiles.active=dev
    java -jar spring-boot-demo.jar --spring.profiles.active=dev

    五.配置加载优先级

    SpringBoot也可以从以下位置加载配置:优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置。
    1.命令行参数
    2.来自java:comp/env的JNDI属性
    3.Java系统属性(System.getProperties())
    4.操作系统环境变量
    5.RandomValuePropertySource配置的random.*属性值
    6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
    7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
    8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
    9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件
    10.@Configuration注解类上的@PropertySource
    11.通过SpringApplication.setDefaultProperties指定的默认属性

    命令行参数如下:

    java -jar ./spring-boot-demo.jar --spring.config.location=~/application.yml
    

    将用户目录下application.yml作为程序的配置文件

    相关文章

      网友评论

          本文标题:SpringBoot配置管理

          本文链接:https://www.haomeiwen.com/subject/ryqlydtx.html