彻底搞懂 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 中的同名项。

相关推荐
小闹54910 小时前
Docker 如何才能学的更扎实
后端·程序员
XovH10 小时前
MySQL 系列:第10篇 存储过程与自定义函数
后端
XovH10 小时前
MySQL 系列:第8篇 子查询与集合操作
后端
XovH10 小时前
MySQL 系列:第9篇 视图——定制化数据窗口
后端
vortex511 小时前
新手前后端开发学习指南:从Flask框架到全栈实践
后端·python·flask
leeyi11 小时前
Retriever 组件:让 Agent 学会「翻资料」的统一接口
人工智能·后端·agent
一个做软件开发的牛马11 小时前
MyBatis 从零实战:完整搭建可运行 Demo,注解与 XML 双模式开发详解
java·后端
砍材农夫11 小时前
python环境|conda安装和使用(1)
开发语言·后端·python·conda
用户2986985301411 小时前
Java 实践:查找与提取 Word 文档超链接
java·后端
Rust研习社11 小时前
Rust 错误处理的黄金搭档:一个定义错误,一个传播错误
后端·rust·编程语言