- 一、配置文件作用
- 二、配置文件的格式
- 三、properties 配置文件说明
- 3.1 properties 基本语法
- 3.2 读取配置文件
- 3.3 properties 缺点分析
- 四、yml 配置文件说明
- 4.1 yml 基本语法
- 4.2 yml 与 properties 格式对比
- 4.3 yml 配置不同数据类型以及 null
- 4.4 yml 配置读取
- 4.4.1 读取配置文件中的字符串
- 4.4.2 读取配置文件中的 null
- 4.4.3 注意事项:value 值加单双引号
- 4.4.4 配置对象
- 4.4.5 配置集合(数组)
- 4.4.6 查看更多系统配置项
- 五、properties 与 yml 总结
一、配置文件作用
整个项目中所有重要的数据都是在配置文件中配置的,例如:
- 数据库的连接信息(包含用户名和密码的设置);
- 项目的启动端口(tomcat - 8080);
- 第三方系统的调用密钥等信息(调用其它 app 的接口);
- 用于发现和定位问题的普通日志和异常日志等。
想象一下,Spring Boot 项目如果没有配置文件,那么连接和操作数据库,查看用于排查问题的日志信息都不存在,Spring Boot 框架就没有那么简便了。所以学会 Spring Boot 的配置文件很重要。
二、配置文件的格式
Spring Boot 配置文件主要分为以下两种格式:
.properties
.yml
两种配置格式都可以使用。
properties 类型的配置文件是创建 Spring Boot 项目时默认的文件格式。
yml 属于新版配置文件格式,提供了更丰富的功能。
特殊说明
- 理论上讲,properties 和 yml 都是可以一起存在于一个项目中。当 properties 和 yml 一起存在同一个项目并且文件中都出现了同样的配置,例如:properties 和 yml 都配置了 “server.port”,那么这时候会以 properties 文件中的为主。也就是说,properties 配置文件的优先级最高,加载完properties 才会加载 yml 文件的配置信息。
- 虽然两种配置文件的格式可以共存,但是在实际业务中,我们通常会采用统一的配置文件格式,这样可以更好的维护。
三、properties 配置文件说明
properties 配置文件时最早期的配置文件格式,也是创建 Spring Boot 项目默认的配置文件。
3.1 properties 基本语法
properties 是以键值对的形式配置的,key 和 value 之间是可以用 “=” 号连接。
# 配置项目的口号
server.port=8088
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
ps. 配置文件中可以使用 “#” 来添加注释信息。
3.2 读取配置文件
如果在项目中,想要读取配置文件的内容,可以使用 @Value 注解来实现。
@Value 注解使用 “${ }” 的格式读取。
@Component
public class ReadYml {
// 读取配置文件中server.port所指向的value值
@Value("${server.port}")
private String port;
@PostConstruct
public void postConstruct() {
System.out.println("port is " + port);
}
}
执行结果:已经成功将端口号修改为 8088.
@Component 在 Spring Boot 启动时会注入框架中,注入框架中会执行 @PostConstruct 初始化方法,这时候就能读取到配置信息了。
3.3 properties 缺点分析
properties 配置是以 key - value 的形式配置的,如图:
从上图可以看出,properties 配置文件中有很多冗余的信息,连接数据库 spring.datasource 就写了三遍。
要解决这个问题,就要使用 yml 配置文件的格式化了。
四、yml 配置文件说明
yml 是 YMAL 的缩写,全称是 Yet Another Markup Language 翻译成中文就是 “另一种标记语言”。
yml 是一个可读性高,易于理解,用来表达数据序列化的格式。它的语法与其它成熟的语言类似,而且可以简单表达数组、散列表、标量等数据形态。
它使用了大量空白符号缩进和依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等。
yml 最大的优势是可以跨语言,不仅在 Java 中使用 golang、python 也可以使用 yml 作为配置文件。
4.1 yml 基本语法
yml 是树状结构的配置文件,它的基本语法是 “key: value”。注意,key 和 value 之间使用英文冒号加空格的方式组成,其中空格不可省略。
基础语法如下:
# 设置端口号
server:
port: 9090
# 记得在冒号和 value 之间加空格
# 错误写法
server:
port:9999
配置正确,代码会是高亮显示的,错误写法并没有高亮显示。
4.2 yml 与 properties 格式对比
yml 使用示例:
spring:
datasource:
url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8
username: root
password: root
yml 和 properties 连接数据库的配置相比
4.3 yml 配置不同数据类型以及 null
# 字符串
string:
value: hello
#布尔类型
boolean:
value1: true
value2: false
# 整数
int:
value1: 10
value2: 0b1010_0111_0100_1010_1110 # 二进制
# 浮点数
float:
value1: 3.1415926
value2: 314159e-5 #科学计数法
# Null, ~ 表示 null
null:
value: ~
4.4 yml 配置读取
yml 读取配置的方式和 properties 相同,使用 @Value 注解即可,实现代码如下:
4.4.1 读取配置文件中的字符串
@Component
public class ReadYml {
@Value("${string.hello}")
private String hello;
@PostConstruct
public void postConstruct() {
System.out.println("string.hello is " + hello);
}
}
运行结果:
4.4.2 读取配置文件中的 null
@Component
public class ReadYml {
@Value("${mynull.value}")
private Object getnull;
@PostConstruct
public void getMyNull() {
System.out.println("mynull.value is " + getnull);
}
}
运行结果:
4.4.3 注意事项:value 值加单双引号
尝试在 application.xml 中配置如下信息:
string1:
str1: hello \n spring boot.
str2: 'hello \n spring boot.'
str3: "hello \n spring boot."
读取程序实现如下:
@Component
public class ReadYml {
@Value("${string1.str1}")
private String str1;
@Value("${string1.str2}")
private String str2;
@Value("${string1.str3}")
private String str3;
@PostConstruct
public void postConstruct() {
System.out.println("string1.str1: " + str1);
System.out.println("string1.str2: " + str2);
System.out.println("string1.str3: " + str3);
}
}
运行结果:
从上述结果可以看出:
- 字符串默认不用加上单引号或者双引号。
- 单引号会转义特殊字符,特殊字符最终还是一个普通的字符串数据。
- 双引号不会转义特殊字符,会让特殊字符表达出本身的意思。
4.4.4 配置对象
我们还可以在 yml 中配置对象,如下:
# 写法一:
user1:
id: 1
name: jjj
age: 18
# 写法二:
user2: {id: 1,name: ccc,age: 15}
这时候还可以使用 @Value 来读取配置信息,但是这是一个对象!对象的属性有可能很多,这就需要多个 @Value 一一对应,这在实际开发中是不可能的。
所以我们要使用另一个注解 @ConfigurationProperties 来读取,具体实现如下:
因为是一个对象,所以先要有实体类装载。
@Component
@ConfigurationProperties(prefix = "user1") // 需要和 yml 配置文件中的相同
public class User {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
调用类实现如下:
@Component
public class ReadYml {
@Autowired
private User user;
@PostConstruct
public void postConstruct() {
System.out.println(user);
}
}
程序运行结果:
4.4.5 配置集合(数组)
配置文件也可以配置 list 集合。
# 写法一
dbtypes1:
name:
- mysql
- sqlserver
- db2
# 写法二. 行内写法
dbtypes2: { name: [aaa,bbb,ccc]}
集合的读取和对象一样,也是使用 @ConfigurationProperties 来读取的,具体实现如下:
@Component
@ConfigurationProperties(prefix = "dbtypes2")
public class ListConfig {
private List<String> name;
public List<String> getName() {
return name;
}
public void setName(List<String> name) {
this.name = name;
}
}
打印类的实现如下:
@Component
public class ReadYml2 {
@Autowired
private ListConfig listConfig;
@PostConstruct
public void postConstruct() {
System.out.println(listConfig.getName());
}
}
4.4.6 查看更多系统配置项
本文有限,Spring Boot 还有很多系统配置项,可以访问官网查看:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties
五、properties 与 yml 总结
- properties 是以 key - value 键值类型的配置形式;而 yml 使用类似 json 格式的树状配置方式,key 和 value 之间使用冒号加空格的方式设置。
- properties 为早期并且默认的配置文件格式,但其配置存在一定的冗余数据,使用 yml 可以很好的解决数据冗余的问题。
- yml 通用性更好,支持更多语言 Java、Go、Python 等。
- yml 虽然与 properties 共存,但一个项目中建议使用统一的配置类型文件。