Spring Boot 中 application.properties 与 application.yml 的全面对比

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. 语法差异详解

特性propertiesyml
层级表示使用点号(.)分隔使用缩进(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[最终配置合并]

配置源优先级顺序

  1. 命令行参数
  2. 来自java:comp/env的JNDI属性
  3. Java系统属性(System.getProperties())
  4. 操作系统环境变量
  5. 随机属性(random.*)
  6. 应用外部的profile-specific配置文件
  7. 应用内部的profile-specific配置文件
  8. 应用外部的application.properties/yml
  9. 应用内部的application.properties/yml
  10. @Configuration类上的@PropertySource注解
  11. 默认属性(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 优点

  1. 语法简单,学习成本低
  2. 几乎所有Java框架都支持
  3. IDE支持完善
  4. 适合简单的键值对配置

application.properties 缺点

  1. 层级结构不明显,冗长
  2. 不支持复杂数据结构
  3. 大文件难以维护

application.yml 优点

  1. 结构清晰,可读性强
  2. 支持复杂数据结构
  3. 适合大型项目配置
  4. 支持多文档块(使用---分隔)

application.yml 缺点

  1. 依赖严格的缩进,格式错误会导致解析失败
  2. 某些IDE支持不如properties完善
  3. 学习曲线略高

7. 最佳实践建议

  1. 小型项目:可以使用properties,简单直接
  2. 大型项目:推荐使用yml,结构更清晰
  3. 团队协作:统一使用一种格式,避免混用
  4. 敏感信息:都不适合存储密码等敏感信息,应使用Vault或环境变量
  5. 版本控制:将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对两者支持都很好,可以根据实际情况灵活选择。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北辰alk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值