SpringBoot配置文件——.properties文件和.yml文件
前言:配置文件的作用
通常情况下,一个项目中的一些重要信息都会放在配置文件中,比如:数据库的连接信息、项目的启动端口、一些第三方的秘钥、记录信息的普通日志和异常日志等。
SpringBoot的配置文件 (.properties 和 .yml)
Spring Boot的配置文件主要有两种格式:.properties文件和.yml文件
这两种格式的配置文件可以共同存在于一个项目中,但一般情况下我们会统一格式,只使用其中的一种,来降低故障率。
.properties是最早期的SpringBoot配置文件的格式,也是现在默认的配置文件格式,出现的时间早于.yml
当这两个配置文件中出现相同的配置时,会优先执行.properties中的配置,然后再执行.yml中的配置,即.properties的优先级大于.yml
properties
创建SpringBoot项目后会自动生成一个配置文件,在该文件中,信息以键值对的形式进行储存
1
2
3
4
5
6
7# 配置项目的信息
# key=value
server.port=8080
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?
characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root缺点
对于同一个对象的多个属性进行设置时很麻烦,需要多次重复,存在冗余配置项;当我们想要设置同一个对象很多的信息时,需要多次重复这个信息:
yml
yml是YMAL的缩写,全称是 Yet Another Markup Language,另一种标记语言
YMAL是一个可读性高、易于理解、用来表达数据序列化的格式。
YMAL的作用是可以做到跨语言使用,不仅Java中可以使用,Go和python中都可以使用
- 语法格式:
- key: value 表示键值对关系,冒号后面必须加一个空格
- 大小写敏感
- 缩进时不允许使用tab键,只能用空格
- 松散表示,java使用驼峰命名,而用原名或者-代替都可以正确映射,比如java中的名称是lastName,yml中使用lastName或者last-name都可以映射到
- 键值关系
1
2
3
4
5
6
7
8# 通常写法
student:
id: 1
name: 张三
age: 20
# 另一种写法
student: { id: 1, name: 张三, age: 20}
yml中,字符串默认不需要加上单引号或者双引号
使用双引号:不会转义字符串中的特殊字符,特殊字符会作为本身想要表达的意思:比如 name: “zhangsan ”,会输出:zhangsan 换行 23 (下面使用@ConfigurationProperties注解演示)
使用单引号:会转义特殊字符,特殊字符失去特殊作用变成普通字符
使用YML连接数据库:
表示常用的字面量:1
2
3
4
5
6spring:
datasource:
url: jdbc:mysql://localhost:3306/bailang_blog?characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30# 普通字面量
name: zhangsan
age: 18
# 布尔类型
flag: true
# 日期
date: 2022/10/27
# 同一个对象的多个属性
people:
name: lisi
age: 20
# 数组
# 用 -表示数组中的一个元素
pets:
- cat
- dog
- pig
# 另一种写法
petss: [dog,cat,pig]
# list对象、set对象、数组对象
students:
- name: zhangsan
age: 22
- name: lisi
age: 20
- {name: wangwu,age: 18}- 语法格式:
读取配置文件的方法
@Value注解读取单个配置项
如果我们想要主动的读取配置文件中的信息,可以使用注解@Value,使用格式: 1
2
private String port;1
2
3# 配置项目端口
server:
port: 7777
@ConfigurationProperties读取配置信息
读取对应前缀的后面的属性
对应application.yml配置文件内容如下:1
2
3
4
5
6
7
8
9
10
// 将类定义为一个bean的注解,比如 @Component,@Service,@Controller,@Repository
// 或者 @Configuration
// 表示使用配置文件中前缀为datatest的属性的值初始化该bean定义产生的的bean实例的同名属性
// 在使用时这个定义产生的bean时,其属性test会是:这是另一个测试属性
public class ConfigurationPropertiesTest {
private String test;
}1
2datatest:
test: 这是另一个测试属性读取配置属性的 list
读取实体类 (将配置文件的一组对象映射到实体类上) 使用格式:
在yml配置文件中,我们创建一个student对象:1
2//spring 启动时直接将配置文件映射到当前类属性上
// test是在配置好的key将这个对象映射到User类中,也就是从配置文件里读取到类中1
2
3
4
5
6
7
8
9
10
11# 配置信息
test:
name: WhiteWaves
id: 33
app:
field: This is Field
count: 99
users:
- JBDC
- Spring
- Boot使用注入的方式将对象注入到一个类中1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class User{
private String name;
private Integer id;
private App app = new App();
public static class App{
private String field;
private Integer count;
private List<String> users = new ArrayList<>();
}
}1
2
3
4
5
6
7
8
9
10
11
12
public class ConfigurationPropertiesTest {
// 属性注入
private User user;
public void test(){
System.out.println(this);
}
}注意包路径配置的问题!!!启动类和要注入的类包必须放在同级目录下,否则读取不到,会显示启动失败Application
总结
- yml语法更简洁,可以解决数据冗余问题
- yml跨语言的通用性更好,它不支持java语言还支持golang 和python
- yml 支持更多的数据类型
- yml格式的配置文件在写的时候更容易出错(冒号后面需要加一个空格),而properties虽然写法更复杂但是不容易出错
- yml虽然可以和properties共存,但一个项目中最好统一格式,只用其中的一个
参考链接