在 Spring Boot 的开发实践中,application.yml 凭借其清晰的结构和强大的层级表达能力,已经逐渐取代传统的 application.properties,成为现代微服务开发的首选配置格式。
相比于扁平化的 Properties 文件,YAML 的核心优势在于:
层级清晰:通过树状结构展示配置,逻辑关系一目了然,避免了冗长的属性前缀(如 server.port 变为 server: 下的 port:)。
简洁高效:去除了重复的键名,文件体积更小,可读性更强。
注释支持:完美支持 # 注释,方便团队协作时的说明与维护。
YAML 的语法非常严格,核心规则只有两条:
冒号空格:键值对之间必须使用冒号加空格(: )分隔。
缩进严格:层级关系通过空格缩进表示(严禁使用 Tab 键),通常建议 2 个空格为一个层级。
服务器与应用配置示例:
在 Properties 中平铺的配置,在 YAML 中通过层级结构组织,看起来更像一棵树。
# 应用基础配置
spring:
application:
name: user-service # 对应 spring.application.name
# 服务器配置
server:
port: 8989 # 对应 server.port
servlet:
context-path: /myapp # 对应 server.servlet.context-pathYAML 的层级特性在处理复杂的数据库 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.DriverPostgreSQL 配置:
spring:
datasource:
url: jdbc:postgresql://localhost:5432/user_db
username: postgres
password: your_secure_password
driver-class-name: org.postgresql.DriverMongoDB 配置:
spring:
data:
mongodb:
uri: mongodb://localhost:27017/user_db在 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.properties 和 application.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。