概述
-
.properties文件以键值类型配置,而.yml文件采用树形配置方式。 -
读取配置文件内容,使用
@Value注解,注解内使用"${}"的格式读取对应内容。 -
yml层级之间严格使用换行缩进的方式配置,key和value之间使用冒号加空格的方式设置,并且空格不可省略 。 -
properties作为早期并且默认的配置文件格式,其配置存在一定的冗余数据,而使用yml可以很好的解决数据冗余的问题,但不适合复杂配置。 -
yml可以和properties共存,如果存在冲突的内容,优先读取properties文件中的内容 。

Ⅰ. 什么是 Spring Boot 配置文件
Spring Boot 支持并定义了配置文件的格式,也在另一个层面达到了规范其他框架集成到 Spring Boot 的目的。很多项目或者框架的配置信息也放在配置文件中,比如:
-
项目的启动端口
Spring Boot内置了Tomcat服务器,默认端口号是8080,但是用户电脑上8080端口号有可能就被其他应用程序占用了,所以Spring Boot需要支持让用户自定义端口号。
-
数据库的连接信息 (包含用户名和密码的设置)
- 为了更方便简单的访问数据库,出现了一些持久层框架,其实就是对
JDBC进行了更深层次的封装。让用户通过简单几行代码就可完成数据库的访问。但是不同的应用程序访问的数据库不同,这些持久层框架就需要支持用户可以自定义配置数据库的连接信息。
- 为了更方便简单的访问数据库,出现了一些持久层框架,其实就是对
-
第三方系统的调用密钥等信息
-
用于发现和定位问题的普通日志和异常日志等
Spring Boot配置文件有以下三种:
application.properties
application.yml(是 yaml 的简写)
application.yaml当应用程序启动时,
Spring Boot会自动从classpath路径找到并加载application.properties和application.yaml或者application.yml文件。也可以通过
spring.config.name指定文件路径和名称,参考https://docs.spring.io/spring-boot/reference/features/external-config.html#features.external-config.files
Ⅱ. properties 配置文件:@Value && @PostConstruct
基本的语法是键值对的形式,键值对之间用 = 隔开,如下所示:
*# 配置项⽬端⼝号*
server.port=9090
*#配置数据库连接信息*
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root读取的时候,使用 @Value 注解搭配 ${} 格式读取,如下所示:
@Controller
public class demo1 {
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String name; // 不需要和键同名
@Value("${spring.datasource.password}")
private String passwd; // 不需要和键同名
@PostConstruct
public void init() {
System.*out*.println(url);
System.*out*.println(name);
System.*out*.println(passwd);
}
}
@PostConstruct注解的方法会在 当前Bean被Spring完全初始化之后 自动执行一次,常用于初始化逻辑。执行顺序如下所示:
static代码块(类加载时) → 构造方法 → 依赖注入 → @PostConstruct -> Bean ready💥注意:
static代码块是在类加载阶段就执行的,比@PostConstruct要早得多 。
Ⅲ. yml 配置文件
yml 是树形结构的配置文件,它的基础语法是 "key: value",其中 key 和 value 之间使用英文冒号加空格的方式组成,并且空格不可省略 !
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
username: root
password: root
*#正确的配置方式*
mykey1: java
*#错误的配置方式❌*
mykey2:java注意: value值默认不用加上单引号或者双引号 。
yml 读取配置的方式和 properties 相同,使用 @Value注解即可 ,如下所示:
@Controller
public class demo2 {
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String name; *// 不需要和键同名*
* *@Value("${spring.datasource.password}")
private String passwd; *// 不需要和键同名*
* *@Value("${mykey1}")
private String mykey; *// 不需要和键同名*
* *@PostConstruct
public void init() {
System.*out*.println(url);
System.*out*.println(name);
System.*out*.println(passwd);
System.*out*.println(mykey);
}
}一、配置不同数据类型
注意对应的类型在 java 后端接收的时候要使用对应的类型接收,不然容易出现类型不匹配的错误!
*# 字符串*
string.value: Hello
*# 布尔值,true或false*
boolean.value1: true
boolean.value2: false
*# 整数*
int.value: 10
*# 浮点数*
float.value: 3.14159
*# Null,用~表示*
null.value: ~
*# 空字符串*
*# 虽然直接后面什么都不加就可以了,但这种方式不直观,更多的表示是使用引号括起来*
empty.value: ''二、Map(字典 / 键值对)
YAML 中的 Map 表示的是一组 key: value 键值对,和 Java 的 Map<String, Object> 类似。
database:
host: localhost
port: 3306
username: root
password: 123456可以理解为:
{
"database": {
"host": "localhost",
"port": 3306,
"username": "root",
"password": "123456"
}
}三、List(集合 / 数组)
YAML 中的 List 是通过 -(短横线)表示的。
✅ 简单列表
fruits:
- apple
- banana
- orange相当于:
{
"fruits": ["apple", "banana", "orange"]
}✅ 列表中的 Map
servers:
- name: server1
ip: 192.168.1.1
- name: server2
ip: 192.168.1.2相当于 Java 中的 List<Map<String, String>>:
{
"servers": [
{ "name": "server1", "ip": "192.168.1.1" },
{ "name": "server2", "ip": "192.168.1.2" }
]
}✅ Map 中包含 List
user:
name: liren
hobbies:
- coding
- hiking
- reading等同于:
{
"user": {
"name": "liren",
"hobbies": ["coding", "hiking", "reading"]
}
}四、@ConfigurationProperties 读取 Map 和 List
myapp:
name: liren
tags:
- java
- spring
- yaml
metadata:
version: v1.0
author: liren dada
servers:
- name: server1
ip: 192.168.1.1
- name: server2
ip: 192.168.1.2创建如下配置类:
@Data
@Component
@ConfigurationProperties("myapp") // 注意名称要对应
public class MyApp {
private String name; *// 普通字段*
* *private List<String> tags; *// List*
* *private Map<String, String> metadata; *// Map*
* *private List<Server> servers; *// 嵌套自定义对象*
@Data
public static class Server {
private String name;
private String ip;
}
}然后使用配置类:
@Controller
public class demo {
@Autowired
private MyApp app;
@PostConstruct
public void init() {
System.*out*.println(app);
}
}
// 运行结果:
MyApp(name=liren, tags=[java, spring, yaml], metadata={version=v1.0, author=liren dada}, servers=[Server(name=server1, ip=192.168.1.1), Server(name=server2, ip=192.168.1.2)])