美文网首页
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作为程序的配置文件

相关文章

  • nacos相关资料

    SpringBoot使用Nacos进行服务注册发现与配置管理:https://www.cnblogs.com/th...

  • 阿里nacos的使用笔记(一)

    一、定位: 它是一个Service的:注册发现管理、配置管理的服务器。 自身是用SpringBoot的完在的Jav...

  • 1.springboot配置管理

    1.spring boot 配置 默认读取application.properties 现在大家常用applica...

  • Nacos - 配置管理(3)

    4 Nacos配置管理基础应用 4.1 Nacos配置管理模型 对于Nacos配置管理,通过Namespace、g...

  • SCM软件配置管理

    软件配置管理 软件配置管理 (Software Configuration Management, SCM) 问题...

  • 配置管理就是配置管理员的事儿吗?

    一说起配置管理,有些部门就会说,我们没有专门的配置管理员,这块工作没法做啊。那么,配置管理就只是配置管理员的事儿吗...

  • 项目管理之配置管理

    1.配置管理的概念 2.配置管理的功能 3.典型的配置项有哪些 4.如何进行配置管理计划 5.如何执行配置管理过程...

  • 一文带你了解配置管理

    一直在说配置管理,配置管理到底是什么?带你了解下什么叫做配置管理,配置管理到底是我们日常在接触的什么工具。 配置管...

  • “社交营销”项目管理原来如此简单(二十)

    二十:知识管理 上篇我们介绍了“项目文档和配置管理"”。“项目文档和配置管理"包括配置管理是为了系统的控制配置变更...

  • 配置管理之二变更管理

    配置管理?配置管理就是管 svn 权限的吧? 之所以很多小伙伴认为配置管理就是管 svn 权限的,是因为对他们来说...

网友评论

      本文标题:SpringBoot配置管理

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