文章目录
- 一、配置文件的作用
- 二、配置文件的格式
- 1、注意
- 2、说明
- 三、properties 配置文件说明
- 1、基本语法
- 2、读取配置文件
- ① 注意
- 3、优缺点
- 四、yml 配置文件说明
- 1、基本语法
- 2、yml 使用进阶
- ① yml 配置不同数据类型及 null
- Ⅰ. yml 配置读取
- Ⅱ. 练习
- a. 值为 null 的配置
- b. 根本不存在的配置
- Ⅲ. string 类型的引号问题
- ② 配置对象
- Ⅰ. 配置
- Ⅱ. 读取
- Ⅲ. 注意事项
- a. 实体类中不能没有 setter 方法
- b. 不能省略类注解
- ③ 配置集合
- Ⅰ. 配置
- Ⅱ. 读取
- 五、问题
- 1、properties 乱码问题
- ① 现象
- ② 解决
- 2、多平台环境的配置文件
- ① 问题
- ② 解决
- 六、对比
一、配置文件的作用
- 配置数据库的连接信息(root / password)
- 项目的启动端口(端口号)
- 第三⽅系统的调⽤秘钥等信息(身份校验)
- 配置日志的级别
二、配置文件的格式
Spring Boot 配置⽂件主要分为以下两种格式:
- .properties
- .yml
如图所示:
1、注意
我们上一节提到过:在 Spring Boot 中是约定大于配置。那么在配置文件这块,约定就是文件名一定是 application 才行。
例如:我们将 配置文件改为 -> applications
- 配置文件内容就是修改端口号为 9090
server.port=9090
- 运行结果为:
- 配置文件名为 application.properties:
- 配置文件名为 applications.properties:
- 配置文件名为 application.properties:
从上面的例子,我们可以看出 Spring Boot 只能识别 applications.properties/.yml 的配置文件。
2、说明
举例:
.properties 配置如下:
server.port=9090
.yml 配置如下:
server:
port: 9091
运行结果为:
上述结果说明:
- .properties 和 .yml 可以共存,但是 .properties 配置⽂件的优先级最⾼;即如果 .properties 和
.yml 中出现了相同的配置,会以 .properties 为主。 - Spring Boot 在加载配置过程中,加载完.properties ⽂件之后,也会加载 .yml ⽂件的配置信息。
- 在实际业务中,我们通常会以一直方式来配置文件,这样可以降低错误率。
三、properties 配置文件说明
1、基本语法
properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的,例如:
# 设置端口号
server.port=9090
# 设置数据库的连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/spring?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
# 用户自定义配置项
mykey.key1=wzr
mykey.key2=zyf
2、读取配置文件
@Value 注解使用“${}”的格式读取,代码如下:
@RestController
public class TestController {
@Value("${mykey.key1}")
private String mykey;
@RequestMapping("/hikey")
public String HiKey(){
return "Hi," + mykey;
}
}
运行结果为:
① 注意
这里必须 使用 “${}” 的格式读取,否则就会读取失败,举例:
@RestController
public class TestController {
@Value("mykey.key1")
private String mykey;
@RequestMapping("/hikey")
public String HiKey(){
return "Hi," + mykey;
}
}
运行结果为:
这是因为,在 Spring Boot 中 约定大于配置,我们约定好 @Value 注解使用“${}”的格式读取到key 对应的 value 值,否则只会把它作为一个字符串赋值给 mykey.key1,而不是读取 mykey.key1 对应的 value 值。
3、优缺点
- 优点:写法简单,不易出错
- 缺点:写法不够灵活,有很多的冗余的信息,如数据库配置中同样的前缀要写很多次:
这个缺点就需要 .yml 配置文件来解决了。
四、yml 配置文件说明
yml 是 YAML(Yet Another Markup Language)的缩写。
yml 的优点:
- 可读性高,写法简单;
- 支持更多的数据类型,还可以表示 数组、散列表、标量等数据结构;
- 支持更多的编程语言,除去 Java,yml 还支持 Golang、Python、PHP、JavaScript等。
1、基本语法
格式:注意冒号后边有空格!!!
# 设置端口号
server:
port: 9090
# 设置数据库的连接信息
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/spring?characterEncoding=utf8
username: root
password: 123456
# 用户自定义配置项
mykey2: wzr....
2、yml 使用进阶
① yml 配置不同数据类型及 null
Ⅰ. yml 配置读取
yml 读取和 properties 相同,代码如下:
@RestController
public class TestController {
@Value("${mykey2}")
private String mykey2;
@RequestMapping("/hikey")
public String HiKey() {
return "Hi," + mykey2;
}
}
运行结果为:
Ⅱ. 练习
使⽤代码测试⼀下,读取值为 null 的配置和根本不存在的配置结果是否⼀致?
a. 值为 null 的配置
yml 配置文件:
# 设置端口号
server:
port: 9090
# 用户自定义配置项
mykey3:
nullkey: ~
测试代码:
@RestController
public class TestController {
@Value("${mykey3.nullkey}")
private String nullkey;
@RequestMapping("/hikey")
public String HiKey() {
return "Hi," + nullkey;
}
}
运行结果为:
b. 根本不存在的配置
我们只需要改一下测试接口:
@RestController
public class TestController {
@Value("${mykey3.nokey}")
private String nokey;
@RequestMapping("/hikey")
public String HiKey() {
return "Hi," + nokey;
}
}
运行结果为:
很明显报错了,这也可以看出,值为 null 与 不存在 是两回事,要注意区分。
Ⅲ. string 类型的引号问题
在 yml 中,字符串默认不加 引号,加上可表示特殊含义。
举例:
配置文件:
# 设置端口号
server:
port: 9090
# 用户自定义配置项
mykey3:
s1: wzr \n zyf
s2: 'wzr \n zyf'
s3: "wzr \n zyf"
测试代码为:
@RestController
public class TestController {
@Value("${mykey3.s1}")
private String s1;
@Value("${mykey3.s2}")
private String s2;
@Value("${mykey3.s3}")
private String s3;
@RequestMapping("/hikey")
public String HiKey() {
System.out.println();
System.out.println("s1:" + s1);
System.out.println();
System.out.println("s2:" + s2);
System.out.println();
System.out.println("s3:" + s3);
System.out.println();
return "s1:" + s1
+ " | s2:" + s2
+ " | s3:" + s3;
}
}
运行结果为:
结论:
双引号可以使得 特殊字符 发挥其作用。
② 配置对象
Ⅰ. 配置
配置对象的方式有两种:
- 原始写法
- 行内写法
# 原始写法
users:
id: 1
name: wzr
age: 19
# 行内写法
users2: {id: 2,name: zyf, age: 19}
Ⅱ. 读取
配置:
# 设置端口号
server:
port: 9090
# 用户自定义配置项
users:
id: 1
name: wzr
age: 19
实体类:
@ConfigurationProperties(prefix = "users")
@Component
public class Users {
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 "Users{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试类:
@RestController
public class TestController {
@Autowired
private Users users;
@RequestMapping("/hikey")
public String HiKey() {
return users.toString();
}
}
运行结果为:
Ⅲ. 注意事项
a. 实体类中不能没有 setter 方法
从配置文件中读取的实体类,实体类中不能没有 setter 方法。
举例:
在实体类中,注释掉一个 setter 方法。
@Component
@ConfigurationProperties(prefix = "users")
public class Users {
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 "Users{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
运行结果为:
这是因为这里的 @ConfigurationProperties 注解是通过 setter 将配置文件中的内容赋值的。
b. 不能省略类注解
@ConfigurationProperties 注解需要搭配类注解使用。
举例:
在实体类中,注释掉类注解
package com.example.springbootdemo.model;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
//@Component
@ConfigurationProperties(prefix = "users")
public class Users {
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 "Users{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
运行结果为:
这里是因为,在 Spring 中,我们需要先将 Bean 注入,否则无法启动项目。
③ 配置集合
Ⅰ. 配置
配置对象的方式有两种:
- 原始写法
- 行内写法
# 原始写法
myList:
name:
- wzr
- zyf
# 行内写法
myList2: {name: [wzr,zyf]}
Ⅱ. 读取
配置:
# 设置端口号
server:
port: 9090
# 用户自定义配置项
myList:
name:
- wzr
- zyf
实体类:这里的 @Data 注解就为我们提供了 getter 和 setter 方法
@Component
@ConfigurationProperties(prefix = "mylist")
@Data
public class MyList {
private List name;
}
测试类:
@RestController
public class TestController {
@Autowired
private MyList myList;
@RequestMapping("/hikey")
public String HiKey() {
return myList.getName().toString();
}
}
运行结果为:
五、问题
1、properties 乱码问题
① 现象
② 解决
原因:配置文件不支持中文
解决方法:File -> settings
2、多平台环境的配置文件
① 问题
在日后的工作中,我们可能对于一个项目需要经过 测试,开发,生产 等等多种环境,这些环境的某些配置可能不相同,但是我们又不想每次更换环境的时候重写配置文件,那怎么办呢?
② 解决
通过 spring.profiles.active 来选择环境配置,我们将不同环境配置写好,然后在使用时只需要选择环境即可。
六、对比
- properties
- properties 是以 key=value 的形式配置的键值类型的配置⽂件
- properties 为早期并且默认的配置⽂件格式,但其配置存在⼀定的冗余数据
- yml
- yml 使⽤的是类似 json 格式的树形配置⽅式进⾏配置文件
- 使⽤ yml 可以很好的解决数据冗余的问题
- yml 通⽤性更好,⽀持更多语⾔
- 两者虽然能共存,但建议只使用一种