Spring Boot 进阶:application.properties 与 application.yml 的全方位对比与最佳实践

Spring Boot 进阶:application.properties 与 application.yml 的全方位对比与最佳实践
博主社群介绍: ① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。 ② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。 ③ 群内也有职场精英,大厂大佬,跨国企业主管,可交流技术、面试、找工作的经验。 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬,进群赠送ZEEKLOG评论防封脚本,送真活跃粉丝,助你提升文章热度。 群公告里还有全网大赛约稿汇总/博客提效工具集/ZEEKLOG自动化运营脚本 有兴趣的加文末联系方式,备注自己的ZEEKLOG昵称,拉你进群,互相学习共同进步。 

文章目录

1. 导读与文章目标

1.1 文章目标

本篇文章旨在从多个角度深入探讨 application.propertiesapplication.yml,覆盖但不限于:

  • 语法层面差异
  • 可读性与维护性
  • 多环境配置策略
  • 配置注入、层级结构表达
  • 复杂配置场景(多维结构、列表、Map)
  • 与 Spring Boot 官方推荐的使用方式
  • 高级技巧与避坑指南

1.2 适用读者

  • Spring Boot 初学者
  • 对配置管理有更高要求的后端工程师
  • 架构师、技术负责人
  • 希望写出更规范、更可维护项目的开发者

2. 配置文件格式基础对比

2.1 基本语法层级结构

2.1.1 application.properties

properties 本质上是 “键值对平铺结构”。

示例:

server.port=8080 spring.datasource.url=jdbc:mysql://localhost:3306/demo spring.datasource.username=root 

它的特点:

特性描述
层级结构用“点”展开spring.datasource.url
不支持复杂结构(List、Map)需要手动展开
不支持注释块只支持 # 单行注释
2.1.2 application.yml

YAML 是一种更现代、更表达式的配置格式,支持嵌套结构与列表。

示例:

server:port:8080spring:datasource:url: jdbc:mysql://localhost:3306/demo username: root 

YAML 特点:

特性描述
层级结构通过缩进表达更贴近对象结构
原生支持 List、Map无需展开
可读性高,适合复杂配置

3. 配置结构对比:嵌套与列表

3.1 嵌套对象表达

这部分是 YAML 完胜 properties 的典型场景。

3.1.1 properties 表达复杂结构
user.address.city=Shanghai user.address.street=East Road user.roles[0]=admin user.roles[1]=editor 

非常冗长,不够直观。

3.1.2 YAML 表达复杂结构(推荐)
user:address:city: Shanghai street: East Road roles:- admin - editor 

3.2 Mermaid 比较图

application.properties平铺结构列表需按下标展开阅读复杂配置困难application.yml缩进表达层级天然支持列表适合复杂场景

图 1:properties 与 yml 结构表达能力对比


4. 多环境配置:profiles 使用方式

4.1 properties 方式

spring.profiles.active=dev 

多环境:

application-dev.properties application-prod.properties 

4.2 YAML 方案(更简洁)

spring:profiles:active: dev 

甚至支持多配置块合并:

server:port:8000---spring:profiles: dev server:port:8001---spring:profiles: prod server:port:9001

5. 在 Spring Boot 中的加载顺序

理解加载顺序至关重要,不同环境下配置冲突时,知道谁覆盖谁能避免线上事故。

5.1 官方顺序(简化版)

1. 命令行参数(优先级最高) 2. application.properties / yml(classpath) 3. 外部配置文件(优先级更高) 4. @PropertySource 5. @ConfigurationProperties 默认值 

5.2 Mermaid 顺序图

命令行参数外部 application.yml内部 application.yml@ConfigurationProperties覆盖覆盖覆盖命令行参数外部 application.yml内部 application.yml@ConfigurationProperties


6. 配置绑定:@Value vs @ConfigurationProperties

6.1 properties 与 yml 都支持

但 YAML 在对象绑定时可读性更强。

6.1.1 @Value 示例
@Value("${user.address.city}")privateString city;

适用于:简单值注入。

6.1.2 @ConfigurationProperties 示例

示例 YAML:

user:name: Jack age:20address:city: Shenzhen 

Java 绑定:

@ConfigurationProperties(prefix ="user")@DatapublicclassUserConfig{privateString name;privateInteger age;privateAddress address;@DatapublicstaticclassAddress{privateString city;}}

7. 哪种方式更受社区推荐?

7.1 官方更推荐 YAML

原因:

  1. 配置清晰,层次结构更明显
  2. 更适合复杂配置(Redis、Kafka、微服务配置)
  3. 支持多 profile 合并写法

7.2 但 properties 仍具价值

尤其在:

  • 小项目
  • 工具类
  • DevOps 配置大量使用 properties
  • IDE 搜索更精确(键名搜索)

8. 表格总结:properties vs yml 全面对比

对比项application.propertiesapplication.yml
表达结构平铺键值对分层结构,缩进表达
可读性
列表表达不友好原生支持
复杂配置不推荐强烈推荐
维护成本中等更低
官方示例较少较多
搜索友好度一般
常用场景小型项目中大型项目、微服务
多 profile文件分离单文件合并支持
可扩展性

9. 常见坑点与最佳实践

9.1 YAML 容易踩的坑

9.1.1 缩进错误

示例(错误):

user:name: Tom 

必须是 2 个空格缩进:

user:name: Tom 
9.1.2 Tab 键禁用

YAML 不允许使用 Tab。

9.2 properties 容易踩的坑

9.2.1 字符串包含等号需要转义
password=p@ss=123 # 可能被解析异常 

10. 真实业务中的推荐实践

10.1 小型项目(个人、小工具)

  • 使用 application.properties
  • 原因:结构简单,文件短小,IDE 搜索友好

10.2 中大型业务系统

  • 使用 application.yml
  • 特别适合以下场景:
    • Redis、Kafka、RabbitMQ 多实例管理
    • 微服务配置大量嵌套结构
    • 多环境配置需要合并

10.3 配置覆盖策略

优先级顺序:

云配置 > 外部 yml > 内部 yml > properties > 默认值 

如果你需要我进一步批量处理格式、自动转换为 Markdown 或生成 PDF,也可以继续告诉我。

结束语

👨‍💻 关于我

持续学习 | 追求真我

如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的。想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎。

感谢订阅专栏 三连文章

image-20251011155556997

掘金点击访问QiunerZEEKLOG点击访问QiunerGitHub点击访问QiunerGitee点击访问Qiuner

专栏简介
📊 一图读懂系列图文并茂,轻松理解复杂概念
📝 一文读懂系列深入浅出,全面解析技术要点
🌟持续更新保持学习,不断进步
🎯 人生经验经验分享,共同成长
你好,我是Qiuner. 为帮助别人少走弯路而写博客

如果本篇文章帮到了你 不妨点个吧~ 我会很高兴的 😄 (^ ~ ^) 。想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎。

代码都在Github或Gitee上,如有需要可以去上面自行下载。记得给我点星星哦😍

如果你遇到了问题,自己没法解决,可以去我掘金评论区问。ZEEKLOG评论区和私信消息看不完 掘金消息少一点.
上一篇推荐链接
Java程序员快又扎实的学习路线点击该处自动跳转查看哦
一文读懂 AI点击该处自动跳转查看哦
一文读懂 服务器点击该处自动跳转查看哦
2024年创作回顾点击该处自动跳转查看哦
一文读懂 ESLint配置点击该处自动跳转查看哦
老鸟如何追求快捷操作电脑点击该处自动跳转查看哦
未来会写什么文章?预告链接
一文读懂 XX?点击该处自动跳转查看哦
2025年终总结点击该处自动跳转查看哦
一图读懂 XX?点击该处自动跳转查看哦

Read more

KWDB 硬核实战:30ms 写入千条轨迹,用 SQL 打造物流车队“天眼”系统

KWDB 硬核实战:30ms 写入千条轨迹,用 SQL 打造物流车队“天眼”系统

前言: 随着 5G 和物联网技术的普及,车联网 (Internet of Vehicles, IoV) 正成为数据爆发的新战场。与传统的静态传感器不同,车辆是移动的计算节点,它们每时每刻都在产生海量的时间序列数据:从 GPS 经纬度到发动机转速,从剩余油量到刹车踏板状态。 对于一家拥有数百辆货车的物流公司而言,这些数据就是金矿。通过实时监控,可以有效降低油耗、杜绝违规驾驶、优化配送路线。然而,传统的关系型数据库在面对车辆高频上报(例如每秒 10 次)的轨迹数据时,往往面临写入瓶颈;而单纯的时序数据库又难以处理复杂的车辆档案关联查询。 KWDB (KaiwuDB) 的“多模”特性恰好解决了这一痛点。今天,我们将实战构建一个物流车队实时监控平台,挑战如何在一个数据库内同时搞定“车辆档案管理”与“海量轨迹分析”。 场景设定:我们要为一个拥有 200 辆货车的物流车队构建监控系统。 核心挑战:高频写入:车辆每 10

By Ne0inhk
Windows安装RabbitMQ保姆级教程(图文详解)

Windows安装RabbitMQ保姆级教程(图文详解)

文章目录 * 前言 * 准备工作 * 系统要求 * 安装概述 * 第一步:下载Erlang * 1.1 访问Erlang官网 * 1.2 下载安装包 * 第二步:安装Erlang * 2.1 运行安装程序 * 2.2 安装向导 * 2.3 配置Erlang环境变量 * 2.4 验证环境变量配置 * 第三步:下载RabbitMQ * 3.1 访问RabbitMQ官网 * 3.2 选择Windows安装包 * 第四步:安装RabbitMQ * 4.1 运行安装程序 * 4.2 安装过程 * 4.3 安装完成 * 4.4 配置RabbitMQ环境变量 * 4.

By Ne0inhk

从 MySQL 7 升级到 MySQL 8:避坑指南与实操全解析

前言 MySQL 8 作为里程碑式的版本,带来了诸多重磅特性(如窗口函数、CTE、更强的 JSON 支持、默认 UTF8MB4 编码、性能优化等),但从 MySQL 7(注:MySQL 官方无 “7” 正式版,通常指 5.7,下文统一以 5.7 代指)升级并非 “一键无脑更”,涉及语法、配置、权限、数据类型等多维度兼容问题。本文结合实战经验,梳理升级核心注意事项、实操步骤与常见坑点,帮你平稳完成升级。 一、升级前必看:核心兼容性差异 1. 默认字符集与排序规则变更 * MySQL 5.7:默认字符集为latin1,排序规则latin1_swedish_

By Ne0inhk
Flutter 组件 leancode_contracts 适配鸿蒙 HarmonyOS 实战:全栈契约编程,构建 API 强类型映射与分布式通讯闭环

Flutter 组件 leancode_contracts 适配鸿蒙 HarmonyOS 实战:全栈契约编程,构建 API 强类型映射与分布式通讯闭环

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 leancode_contracts 适配鸿蒙 HarmonyOS 实战:全栈契约编程,构建 API 强类型映射与分布式通讯闭环 前言 在鸿蒙(OpenHarmony)生态迈向大规模跨端协同、涉及前后端高度解耦但逻辑高度依赖的背景下,如何确保客户端与服务端之间的数据交互具备“原子级”的类型安全,已成为提升全栈迭代效率的关键。在鸿蒙设备这类强调分布式部署与多端身份识别的环境下,如果应用依然依赖手写 DTO(Data Transfer Objects)执行网络请求,由于由于人工维护导致的字段命名失配或类型语义漂移,极易由于由于“联调地狱”导致版本交付延期及线上逻辑错位。 我们需要一种能够实现指令驱动(CQRS)、支持跨语言自动生成且具备强类型契约约束的通讯治理方案。 leancode_contracts 为 Flutter 开发者引入了业界领先的契约编程模型。它通过将后端的 API 定义直接映射为端侧的 Dart 强类型对象,彻底消除了

By Ne0inhk