XML 過於冗長,JSON 缺乏註解且巢狀大括號難以維護。YAML (YAML Ain't Markup Language) 以縮進表達層級、支援註解、且是JSON 超集,完美平衡了可讀性與表達力,成為 Spring Boot、Kubernetes、CI/CD 流程的標準配置格式。
# 映射: key: value (冒號後必須有空格)
server:
port: 8080
address: 0.0.0.0
servlet:
context-path: /api
# 短橫線開頭
spring:
profiles:
active:
- dev
- mysql
- redis
# JSON 風格 (行內)
spring.profiles.active: [dev, mysql, redis]
# | 保留換行
description: |
第一行
第二行
第三行
# > 折疊為單行 (換行變空格)
summary: >
這是一段很長的說明文字,
會被折疊成單行輸出。
defaults: &defaults
timeout: 3000
retries: 3
serviceA:
<<: *defaults # 合併錨點內容
name: OrderService
serviceB:
<<: *defaults
name: PaymentService
timeout: 5000 # 覆蓋特定值
Spring Boot 內建 `snakeyaml`,直接 `@ConfigurationProperties` 綁定:
@ConfigurationProperties(prefix = "app")
@Data
public class AppConfig {
private String name;
private List<String> tags;
private Map<String, Object> metadata;
private NestedConfig nested;
}
// application.yml
app:
name: MyApp
tags: [core, backend]
metadata:
version: 1.0
author: team
nested:
enabled: true
threshold: 100
Yaml yaml = new Yaml();
// 讀成 Map
Map<String, Object> data = yaml.load(new FileInputStream("config.yml"));
// 讀成 POJO
AppConfig config = yaml.loadAs(new FileInputStream("config.yml"), AppConfig.class);
// 寫入
String output = yaml.dump(config);
Files.writeString(Paths.get("out.yml"), output);
| 特性 | YAML | JSON | XML |
|---|---|---|---|
| 可讀性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| 註解支援 | ✅ | ❌ | ✅ |
| 多行字串 | ✅ (| / >) | ❌ (需轉義) | ✅ (CDATA) |
| 錨點複用 | ✅ | ❌ | ❌ (需 XInclude) |
| 解析速度 | 中 | 快 | 慢 |
| 工具生態 | 極佳 | 極佳 | 成熟 |
| 適用場景 | 配置文件、資料序列化 | API 傳輸、NoSQL | 文檔標記、企業整合 |
YAML 以人類友善的設計,成為現代雲原生時代的配置通用語。掌握其核心語法、錨點複用、多行文字與 Java 綁定技巧,能讓你的配置管理更優雅、更安全。