彻底搞懂 Spring Boot 中 properties 和 YAML 的区别

在 Spring Boot 开发中,application.propertiesapplication.yml 是最常用的两种配置文件格式。随着项目复杂度提升,越来越多团队转向 YAML。那么,它们到底有何不同?今天我们就从定位、语法、数据表达能力、通用性四个角度,系统对比这两种配置方式。


一、定位不同:工具 vs 语言

properties 文件本质上是"属性文件"(Properties File),其设计初衷是在 Java 应用中以键值对的形式存储配置项。它简洁直接,长期以来作为 Spring Boot 默认的配置格式(尤其在 2.x 版本中)。

YAML (YAML Ain't Markup Language,原意为 "Yet Another Markup Language")则是一种通用的数据序列化格式,定位远不止于"配置属性"。它旨在以人类可读的方式表达结构化数据,适用于多种场景和语言。

一句话总结:properties 是一个配置工具,YAML 是一种表达结构化数据的语言。


二、语法风格:扁平 vs 层级

properties 语法

采用经典的 key=value 格式,每行一个配置项:

ini 复制代码
server.port=8080
debug=true
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/dbname?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root

YAML 语法

使用缩进和冒号表示层级关系,冒号后必须跟一个空格

yaml 复制代码
server:
  port: 9090
debug: true
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/dbname?characterEncoding=utf8
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

优势:YAML 层级清晰、结构直观,尤其在配置嵌套属性时,可读性和维护性显著优于 properties。


三、复杂数据类型支持:YAML 更强大

除了基本的字符串、数字、布尔值,YAML 原生支持对象、列表、Map 等复杂结构,无需额外解析逻辑。

示例:配置对象

yaml 复制代码
user:
  id: 1
  name: Tom
  age: 20

示例:配置列表

markdown 复制代码
# 列表写法一(推荐)
animals:
  - Dog
  - Cat
  - Bird

# 列表写法二(行内)
animals: [Dog, Cat, Bird]

相比之下,properties 虽可通过 list[0]=Dog 等方式模拟集合,但语法繁琐且易出错,远不如 YAML 自然。

对比:properties 模拟列表(不直观)

css 复制代码
animals[0]=Dog 
animals[1]=Cat 
animals[2]=Bird

四、YAML 具备跨语言通用性

properties 是 Java 生态特有的配置格式,几乎仅用于 JVM 项目。

YAML 是一种语言无关的数据格式,被广泛应用于 Python、JavaScript、Go、Ruby、PHP 等多种编程语言中。

这意味着:在多语言微服务架构中,若使用统一的配置中心(如 Nacos、Apollo),各团队可共享同一份 YAML 配置文件,极大提升协作效率与运维一致性。


总结

维度 properties YAML
定位 Java 属性配置 通用数据序列化语言
语法 key=value,扁平结构 key: value,支持嵌套与缩进
数据类型 仅基础类型 支持对象、列表、Map 等复杂结构
通用性 仅限 Java/Spring 多语言通用

虽然 Spring Boot 同时支持两种格式,但从可读性、表达力和生态兼容性来看,YAML 显然是更现代、更优雅的选择。如果你的新项目尚未选定配置格式,不妨大胆拥抱 YAML!


💡 小贴士 :Spring Boot 会优先加载 application.yml(如果存在),若两者共存,YAML 配置将覆盖 properties 中的同名项。

相关推荐
fliter13 分钟前
Go设计取舍之一: goroutine 为什么保持匿名、无状态
后端
fliter20 分钟前
Go设计取舍之二: maps.Keys和Values为什么返回迭代器
后端
热心市民lcj26 分钟前
Spring Boot 整合 Caffeine 本地缓存实战
spring boot·后端·缓存
Revolution6129 分钟前
Nest.js 是什么:怎样用它写出第一个后端接口
后端·node.js·nestjs
aiopencode39 分钟前
SwiftUI Introspect生产环境完全指南:为什么它是安全可靠的选择
后端·ios
shengjk11 小时前
x86架构发展史:从8086到x86-64,一文看懂40多年CPU指令集如何改变世界
后端
JackSparrow4142 小时前
前端安全之JS混淆+请求加密+请求签名以提升爬虫难度
前端·javascript·后端·爬虫·python·安全
geovindu2 小时前
go:loghelper
开发语言·后端·golang
小满zs3 小时前
Go语言第四章(类型转换)
后端·go
人间凡尔赛5 小时前
告别冷启动!WebAssembly + Spin 实战:Serverless 延迟从 1 秒降到 1 毫秒
后端·云原生·serverless·webassembly·spin