一.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,也可以通过正则表达式和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作为程序的配置文件
网友评论