1.1 概述
SpringBoot 是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就需要添加配置文件。在 Spring Boot 中,配置文件有两种不同的格式,一个是 application.properties
另一个是 application.yml
或 application.yaml
。虽然 properties 文件比较常见,但是相对于 properties 而言,yaml 更加简洁明了,而且使用的场景也更多,很多开源项目都是使用 yaml 进行配置。除了简洁,yaml 还有另外一个特点,就是 yaml 中的数据是有序的,properties 中的数据是无序的,在一些需要路径匹配的配置中,顺序就显得尤为重要,因此 Spring Boot 中我们一般采用 yaml。SpringBoot 默认会从 resources 目录下加载 application.properties 或 application.yml(application.yaml) 文件,所以 SpringBoot 项目中一般将配置文件放到 resources 中。
1.2 yml
1.2.1 简介
YML 文件格式是 YAML(YAML Aint Markup Language) 编写的文件格式,YAML 是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持 YAML 库的不同的编程语言程序导入,比如: C/C++,Ruby,Python,Java,Perl,C#,PHP 等。YML 文件是以数据为核心的,比传统的 xml 方式更加简洁。YML 文件的扩展名可以使用 .yml 或者 .yaml。
1.2.2 yml 语法
☞ 约定
① 大小写敏感
② k: v 表示键值对关系,冒号后面必须有一个空格
③ 缩进时不允许使用 Tab 键,只允许使用空格
④ 使用空格的缩进表示层级关系,空格数目不重要,只要是左对齐的一列数据,都是同一个层级的
⑤ 松散表示,java 中对于驼峰命名法,可用原名或使用 -
代替驼峰,如 java 中的 userName 属性,在 yml 中使用 userName 或 user-name 都可正确映射
☞ 普通值
字符串默认不用加上单引号或者双绰号;双引号:不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思;单引号:会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name1: zhangsan
name2: 'zhangsan \n lisi'
name3: "zhangsan \n lisi"
age: 18
flag: true
☞ 日期
date: 2020/7/28
☞ 对象(属性和值)
people:
name: zhangsan
age: 20
☞ Map(键值对)
people: {name:zhangsan, age: 20}
☞ 数组、list、set
# 用 - 表示数组中的一个元素, - 和 value 之间存在空格
city:
- beijing
- tianjin
- shanghai
- chongqing
# 或者
city: [beijing, tianjin, shanghai, chongqing]
# 集合中的元素是对象形式
student:
- name: zhangsan
age: 18
score: 100
- name: lisi
age: 28
score: 88
- name: wangwu
age: 38
score: 90
1.2.3 文档快
对于测试环境,开发环境,生产环境可以使用不同的配置,如果只想写到一个文件中,yml 与是支持的,使用用 — 隔开,称之为文档块。过 yml 文件构建多文档块,区分不同环境配置,自由切换不同环境启动项目,一个配置文件搞定。
# 这里可以配置 MySQL 等环境
spring:
profiles:
# 选择哪一个环境的配置
active: dev
# 使用 --- 划分文档块
---
server:
port: 8081
spring:
profiles: test
---
server:
port: 8082
spring:
profiles: dev
---
server:
port: 8083
spring:
profiles: prod
1.3 配置文件加载顺序
首先咱们先在 resources 中写一个 properties 文件和一个 yml 文件,然后分别再两个文件中写入不同名称的数据,最后写一个 controller 将两个文件中的数据读取返回。可以发现两个文件中的数据都读取到了,所以两个配置文件均生效,不会只读取一个配置文件。
如果两个配置文件中出现同名的配置呢?修改一下配置文件,重新请求发现返回的是 properties 的配置。如果同一个目录下,有 application.yml 也有 application.properties,默认先读取 application.properties。如果同一个配置属性,在多个配置文件都配置了,默认使用第 1 个读取到的,后面读取的不覆盖前面读取到的。
1.4 配置文件的位置
从官方文档中可以发现还有其他位置可以放配置文件,SpringBoot 配置文件默认可以放到以下目录中,可以自动读取到
♞ 项目根目录下
♞ 项目根目录中 config 目录下
♞ 项目的 resources 目录下
♞ 项目 resources 目录中 config 目录下
该列表按优先级排序(在列表较高位置定义的属性会覆盖在较低位置定义的属性),这些仅作为了解内容,在开发中配置文件一般都会在项目的 resources 目录下。
1.5 获取配置属性
1.5.1 使用注解 @Value 映射
由于 Spring Boot 源自 Spring ,所以 Spring 中存在的属性注入,在 Spring Boot 中一样也存在。我们可以通过 @Value 注解将配置文件中的值映射到一个 Spring 管理的 Bean 的字段上。
person:
name: jack
age: 18
@RestController
public class QuickStartController {
@Value("${person.name}")
private String name;
@Value("${person.age}")
private Integer age;
@GetMapping("/quick")
public String quick(){
return "springboot 访问成功! name=" + name + ", age=" + age;
}
}
1.5.2 使用注解 @ConfigurationProperties 映射
Spring Boot 引入了类型安全的属性注入,如果采用 Spring 中的配置方式,当配置的属性非常多的时候,工作量就很大了,而且容易出错。使用类型安全的属性注入,可以有效的解决这个问题。通过注解 @ConfigurationProperties(prefix=“配置文件中的 key 的前缀”) 可以将配置文件中的配置自动与实体进行映射。但是要注意使用 @ConfigurationProperties 方式可以进行配置文件与实体字段的自动映射,但需要字段必须提供 set 方法才可以,而使用 @Value 注解修饰的字段不需要提供 set 方法。
@RestController
@ConfigurationProperties(prefix = "person")
public class QuickStartController {
private String name;
private Integer age;
@GetMapping("/quick")
public String quick(){
return "springboot 访问成功! name=" + name + ", age=" + age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
}