源本科技 | 码上会

Spring Boot 配置 yaml

2026/03/27
10
0

引言

在 Spring Boot 的开发实践中,application.yml 凭借其清晰的结构和强大的层级表达能力,已经逐渐取代传统的 application.properties,成为现代微服务开发的首选配置格式。

为什么选择 YAML

相比于扁平化的 Properties 文件,YAML 的核心优势在于:

  • 层级清晰:通过树状结构展示配置,逻辑关系一目了然,避免了冗长的属性前缀(如 server.port 变为 server: 下的 port:)。

  • 简洁高效:去除了重复的键名,文件体积更小,可读性更强。

  • 注释支持:完美支持 # 注释,方便团队协作时的说明与维护。

YAML 配置

YAML 的语法非常严格,核心规则只有两条:

  1. 冒号空格:键值对之间必须使用冒号加空格(: )分隔。

  2. 缩进严格:层级关系通过空格缩进表示(严禁使用 Tab 键),通常建议 2 个空格为一个层级。

服务器与应用配置示例:
在 Properties 中平铺的配置,在 YAML 中通过层级结构组织,看起来更像一棵树。

# 应用基础配置
spring:
  application:
    name: user-service  # 对应 spring.application.name

# 服务器配置
server:
  port: 8989  # 对应 server.port
  servlet:
    context-path: /myapp  # 对应 server.servlet.context-path

数据库配置案例

YAML 的层级特性在处理复杂的数据库 URL 或 JPA 属性时尤为明显,它能让配置看起来更加整洁。

MySQL 配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/user_db?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8
    username: root
    password: your_secure_password
    driver-class-name: com.mysql.cj.jdbc.Driver

PostgreSQL 配置:

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/user_db
    username: postgres
    password: your_secure_password
    driver-class-name: org.postgresql.Driver

MongoDB 配置:

spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017/user_db

Hibernate (JPA) 配置

在 YAML 中配置 JPA 属性时,原本冗长的 spring.jpa.properties... 变成了清晰的树状结构。

spring:
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL8Dialect
        format_sql: true

配置文件优先级与加载机制

在 Spring Boot 应用中,配置不仅仅来源于 application.yml。为了适应不同的部署环境和微服务架构,Spring Boot 定义了一套严格的外部化配置优先级规则。

核心原则:高优先级的配置会覆盖低优先级的同名配置。

1. 文件位置优先级(从高到低)
Spring Boot 会按照以下顺序查找配置文件,一旦找到同名配置,高优先级的会覆盖低优先级的:

  • 命令行参数:启动时直接指定,优先级最高。

    • 例如:java -jar app.jar --server.port=8081

  • 外部 Config 目录:Jar 包同级目录下的 /config 子目录。

    • 路径:./config/application.yml

    • 用途:运维部署时修改配置,无需重新打包。

  • 外部根目录:Jar 包同级目录。

    • 路径:./application.yml

  • 类路径 Config 目录:资源文件夹下的 /config 目录。

    • 路径:classpath:/config/application.yml

  • 类路径根目录:资源文件夹根目录。

    • 路径:classpath:/application.yml(开发阶段默认位置)

2. 文件名与类型的优先级
除了位置,文件名的不同也决定了加载的先后顺序。

  • bootstrap vs application

    • bootstrap.yml ( 或 bootstrap.properties):由父上下文(Bootstrap Context)加载,优先级高于 application 配置。它通常用于 Spring Cloud 项目中,配置连接配置中心(如 Nacos、Config Server)的信息,确保在应用主上下文加载前就能获取到远程配置。

    • application.yml ( 或 application.properties):由主应用程序上下文加载,用于常规的应用配置。

  • .properties vs .yml

    • 如果在同一目录下同时存在 application.propertiesapplication.yml,Spring Boot 会先加载 .properties 文件,再加载 .yml 文件。

    • 因此,application.yml 的优先级略高于 application.properties(后加载的覆盖先加载的)。

3. Profile 优先级
当激活特定环境(如 dev)时,application-dev.yml 的优先级高于通用的 application.yml

总结

  • YAML 是首选:利用其层级结构管理复杂配置,使 application.yml 更加整洁易读。

  • 环境隔离:使用 application-{profile}.yml 隔离开发、测试和生产配置。

  • 优先级铁律:记住“外部高于内部,命令行高于文件”。

  • 特殊文件bootstrap 配置用于引导加载(如配置中心),优先级高于 application;而在同级目录下,.yml 会覆盖 .properties