Spring Boot 支持两种主要的配置文件格式:.properties
和 .yml
(YAML)。下面从多个维度详细比较这两种格式的差异。
1. 基本格式对比
application.properties 格式
# 键值对格式,使用点号(.)表示层级
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
# 数组/列表表示
spring.profiles.active=dev,test
application.yml 格式
# 使用缩进表示层级关系
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: secret
profiles:
active:
- dev
- test
2. 语法差异详解
特性 | properties | yml |
---|---|---|
层级表示 | 使用点号(.)分隔 | 使用缩进(2个空格)表示层级 |
数组/列表 | 使用逗号分隔 | 使用短横线(-)表示数组元素 |
多行文本 | 使用\ 续行 | 使用` |
数据类型 | 所有值都是字符串 | 支持字符串、布尔值、数字、null等原生类型 |
注释 | 使用# | 使用# |
特殊字符 | 需要转义 | 大部分情况下不需要转义 |
3. 复杂配置示例对比
对象嵌套配置
properties:
spring.redis.cluster.nodes[0]=127.0.0.1:6379
spring.redis.cluster.nodes[1]=127.0.0.1:6380
spring.redis.cluster.max-redirects=3
yml:
spring:
redis:
cluster:
nodes:
- 127.0.0.1:6379
- 127.0.0.1:6380
max-redirects: 3
多环境配置
properties:
# 默认配置
logging.level.root=INFO
# 开发环境
---
spring.profiles=dev
logging.level.root=DEBUG
logging.level.org.springframework.web=TRACE
# 生产环境
---
spring.profiles=prod
logging.level.root=WARN
yml:
# 默认配置
logging:
level:
root: INFO
---
# 开发环境
spring:
profiles: dev
logging:
level:
root: DEBUG
org.springframework.web: TRACE
---
# 生产环境
spring:
profiles: prod
logging:
level:
root: WARN
4. 加载顺序与优先级
Spring Boot 配置加载流程图:
graph TD
A[启动应用] --> B[加载application.properties/yml]
B --> C[加载profile-specific配置 application-{profile}.properties/yml]
C --> D[外部配置: 命令行参数,系统环境变量等]
D --> E[最终配置合并]
配置源优先级顺序:
- 命令行参数
- 来自
java:comp/env
的JNDI属性 - Java系统属性(System.getProperties())
- 操作系统环境变量
- 随机属性(random.*)
- 应用外部的profile-specific配置文件
- 应用内部的profile-specific配置文件
- 应用外部的application.properties/yml
- 应用内部的application.properties/yml
- @Configuration类上的@PropertySource注解
- 默认属性(SpringApplication.setDefaultProperties)
5. 与@ConfigurationProperties的配合使用
配置类定义
@Configuration
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {
private String name;
private int version;
private List<String> servers = new ArrayList<>();
private Map<String, String> metadata = new HashMap<>();
// getters and setters
}
properties配置方式
myapp.name=MyApplication
myapp.version=1
myapp.servers[0]=server1
myapp.servers[1]=server2
myapp.metadata.key1=value1
myapp.metadata.key2=value2
yml配置方式
myapp:
name: MyApplication
version: 1
servers:
- server1
- server2
metadata:
key1: value1
key2: value2
6. 优缺点分析
application.properties 优点
- 语法简单,学习成本低
- 几乎所有Java框架都支持
- IDE支持完善
- 适合简单的键值对配置
application.properties 缺点
- 层级结构不明显,冗长
- 不支持复杂数据结构
- 大文件难以维护
application.yml 优点
- 结构清晰,可读性强
- 支持复杂数据结构
- 适合大型项目配置
- 支持多文档块(使用
---
分隔)
application.yml 缺点
- 依赖严格的缩进,格式错误会导致解析失败
- 某些IDE支持不如properties完善
- 学习曲线略高
7. 最佳实践建议
- 小型项目:可以使用properties,简单直接
- 大型项目:推荐使用yml,结构更清晰
- 团队协作:统一使用一种格式,避免混用
- 敏感信息:都不适合存储密码等敏感信息,应使用Vault或环境变量
- 版本控制:将application.yml/properties加入版本控制,但排除包含敏感信息的profile-specific文件
8. 高级特性
YAML的多文档块特性
# 公共配置
spring:
application:
name: myapp
---
# 开发环境
spring:
profiles: dev
server:
port: 8080
---
# 生产环境
spring:
profiles: prod
server:
port: 80
Properties的多环境配置
# application-dev.properties
server.port=8080
# application-prod.properties
server.port=80
9. 转换工具
可以使用在线工具在两种格式间转换:
总结
选择.properties
还是.yml
主要取决于项目需求和个人偏好。YAML在表达复杂结构时更有优势,而Properties在简单场景下更直接。Spring Boot对两者支持都很好,可以根据实际情况灵活选择。