Spring Boot 中 YAML 配置文件详解

在 Spring Boot 项目中,配置文件是不可或缺的一部分,用于自定义应用行为、覆盖默认设置。除了传统的 properties 文件,Spring Boot 对 YAML(YAML Ain’t Markup Language)格式提供了完美支持。YAML 以其简洁的语法、清晰的层级结构,成为许多开发者的首选配置方式。

一、YAML 是什么?为什么用 YAML?

YAML 是一种数据序列化格式,设计目标是易读易写,同时兼顾机器解析效率。与传统的 properties 文件相比,YAML 具有以下优势:

  • 层级结构清晰:通过缩进表示配置之间的父子关系,避免了 properties 中重复的前缀(如 server.portserver.servlet.context-path)。
  • 支持复杂数据类型:原生支持对象、列表、Map 等复杂结构,无需额外语法。
  • 语法简洁:去掉了 properties 中的等号和多余标点,减少冗余代码。

Spring Boot 会自动加载 resources 目录下的 application.ymlapplication.yaml 文件,其优先级与 application.properties 一致(可通过配置位置调整优先级)。

二、YAML 基础语法规则

使用 YAML 时,需遵守以下核心规则,否则可能导致配置加载失败:

  1. 大小写敏感nameName 代表不同的配置项。
  2. 缩进表示层级:使用空格(不允许使用 Tab)缩进,缩进数量不限,但同级配置必须对齐。
  3. 键值对格式:键与值之间用冒号加空格分隔(如 key: value),冒号后必须有空格。
  4. 注释:以 # 开头的行为注释,会被忽略。
  5. 字符串无需引号:默认情况下,字符串可以不加引号;若包含特殊字符(如空格、冒号),需用单引号或双引号包裹。

示例:

# 基本键值对
server:port: 8080  # 端口配置servlet:context-path: /demo  # 上下文路径# 字符串配置(含特殊字符)
app:title: "Spring Boot: YAML 教程"  # 双引号保留特殊字符description: 'Hello: World'      # 单引号也支持

三、YAML 配置常见数据类型

YAML 支持多种数据类型,从简单值到复杂结构均可轻松表示,以下是开发中常用的类型及示例:

1. 简单数据类型

包括字符串、数字、布尔值等,直接以 key: value 形式定义:

# 简单数据类型示例
user:id: 1001          # 数字name: 张三         # 字符串isVip: true        # 布尔值score: 98.5        # 浮点数joinDate: 2023-10-01  # 日期(字符串形式)

2. 对象类型

用于表示包含多个属性的实体,支持两种写法:

  • 缩进式:通过缩进体现属性层级。
  • 行内式:用 {} 包裹,属性之间用逗号分隔。

示例:

# 对象配置(缩进式)
user1:name: 张三age: 20address: 北京# 对象配置(行内式)
user2: {name: 李四, age: 22, address: 上海}

3. 集合类型

包括列表(List)和集合(Set),支持两种写法:

  • 短横线式:每个元素前加 - (短横线+空格)。
  • 行内式:用 [] 包裹,元素之间用逗号分隔。

示例:

# 列表配置(短横线式)
city1:- 北京- 上海- 广州# 列表配置(行内式)
city2: [北京, 上海, 广州]# 集合中的元素是对象
students:- id: 1name: 张三age: 20- id: 2name: 李四age: 22

⚠️ 注意:短横线与元素值之间必须有空格,否则会解析错误 。

四、Spring Boot 中 YAML 的核心应用

1. 覆盖默认配置

Spring Boot 有许多默认配置(如 Tomcat 端口、日志级别等),可通过 YAML 覆盖:

# 覆盖服务器配置
server:port: 8888  # 端口改为 8888(默认 8080)tomcat:max-threads: 200  # Tomcat 最大线程数# 日志配置
logging:level:root: info  # 根日志级别com.example: debug  # 自定义包日志级别

2. 自定义配置与读取

除了框架默认配置,还可在 YAML 中定义自定义配置,再通过代码读取使用。

方式 1:@Value 注解(适合简单配置)

@Value 可直接映射 YAML 中的简单值(如字符串、数字),语法为 ${key}

# 自定义配置
app:name: 我的应用version: 1.0.0authors:- 张三- 李四

代码中读取:

@Controller
public class YamlController {@Value("${app.name}")private String appName;  // 映射 "我的应用"@Value("${app.version}")private String appVersion;  // 映射 "1.0.0"@Value("${app.authors[0]}")  // 读取列表第一个元素private String firstAuthor;  // 映射 "张三"// 业务方法...
}

⚠️ 注意:@Value 仅支持简单类型,无法直接映射对象或复杂集合 。

方式 2:@ConfigurationProperties(适合对象/复杂配置)

当配置项较多或为对象结构时,推荐使用 @ConfigurationProperties 将配置批量映射到实体类:

  1. 定义实体类并绑定配置前缀:
@Component
@ConfigurationProperties(prefix = "user")  // 绑定前缀 "user"
public class UserConfig {private Integer id;private String name;private List<String> address;  // 映射列表// getter + setter(必须存在,否则无法绑定)
}
  1. YAML 配置:
# 用户配置(与实体类对应)
user:id: 1001name: 张三address:- 北京- 上海
  1. 使用时直接注入实体类:
@Controller
public class UserController {@Autowiredprivate UserConfig userConfig;  // 自动注入配置@GetMapping("/user")@ResponseBodypublic String getUser() {return "ID: " + userConfig.getId() + ", 姓名: " + userConfig.getName();}
}

3. 占位符与动态配置

YAML 支持通过 ${} 引用其他配置项或使用框架提供的工具类生成动态值:

引用其他配置
server:port: 8080
app:url: http://localhost:${server.port}/demo  # 引用 server.port 的值
生成随机值

Spring Boot 提供 random 工具类,可生成随机数、UUID 等:

# 随机值示例
config:randomInt: ${random.int}  # 随机整数randomIntRange: ${random.int(100, 200)}  # 100-200 之间的随机整数randomUUID: ${random.uuid}  # 随机 UUIDrandomLong: ${random.long}  # 随机长整数

五、YAML 配置文件的优先级

Spring Boot 会从多个位置加载 application.yml,优先级从高到低如下(高优先级配置会覆盖低优先级):

  1. 项目根目录下的 /config 子目录(./config/application.yml
  2. 项目根目录(./application.yml
  3. resources 目录下的 /config 子目录(classpath:/config/application.yml
  4. resources 目录(classpath:/application.yml

可根据需求将配置文件放在不同位置,例如:

  • 开发环境配置放在 resources/config 中,方便修改。
  • 生产环境配置放在项目根目录的 config 中,避免打包到 Jar 包内。

六、常见问题与解决方案

  1. 配置不生效?

    • 检查语法:是否漏写冒号后的空格、缩进是否正确。
    • 检查路径:配置文件是否在 resources 目录或指定的优先级目录中。
    • 检查注解:使用 @ConfigurationProperties 时,确保实体类有 getter/setter 方法。
  2. 中文乱码?

    • 确保 YAML 文件编码为 UTF-8(IDEA 中可在 File -> Settings -> Editor -> File Encodings 中设置)。
  3. 如何区分多环境?

    • 创建多环境配置文件,如 application-dev.yml(开发)、application-prod.yml(生产),通过 spring.profiles.active=dev 指定激活环境。

总结

YAML 以其简洁的语法和强大的表达能力,成为 Spring Boot 配置的优选格式。掌握 YAML 的基础语法、数据类型映射及实战技巧,能显著提升配置文件的可读性和维护性。在实际开发中,建议结合 @ConfigurationProperties 管理复杂配置,并合理利用多环境配置和优先级规则,让配置更加灵活高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92413.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92413.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92413.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Milvus安装可视化工具,attu,保姆级

安装包链接&#xff1a;GitHub - zilliztech/attu: Web UI for Milvus Vector Databasehttps://github.com/zilliztech/attu?tabreadme-ov-file 下滑 举例&#xff1a;windows&#xff1a;下载安装&#xff0c;然后就可以连接了&#xff08;安装完打开后如果需要输入用户名密码…

避免“卡脖子”!如何减少内存I/O延迟对程序的影响?

单来说&#xff0c;内存 IO 就像是计算机的 “数据高速公路”&#xff0c;负责在内存和其他设备&#xff08;如硬盘、CPU 等&#xff09;之间传输数据。它的速度和效率直接影响着计算机系统的整体性能。 你有没有想过&#xff0c;当你点击电脑上的一个应用程序&#xff0c;它是…

V4L2摄像头采集 + WiFi实时传输实战全流程

&#x1f4d6; 推荐阅读&#xff1a;《Yocto项目实战教程:高效定制嵌入式Linux系统》 &#x1f3a5; 更多学习视频请关注 B 站&#xff1a;嵌入式Jerry V4L2摄像头采集 WiFi实时传输实战全流程 1. 实战场景概述 目标&#xff1a; 嵌入式设备&#xff08;如RK3588/正点原子开发…

Java 之 设计模式

1.单例模式1. ​​饿汉式&#xff08;Eager Initialization&#xff09;​​​​核心原理​​&#xff1a;类加载时立即创建实例&#xff0c;通过静态变量直接初始化。​​代码示例​​&#xff1a;public class Singleton {private static final Singleton INSTANCE new Sing…

[激光原理与应用-185]:光学器件 - BBO、LBO、CLBO晶体的全面比较

一、相同点非线性光学晶体属性BBO、LBO、CLBO均为非中心对称晶体&#xff0c;具备非线性光学效应&#xff0c;广泛应用于激光频率转换&#xff08;如倍频、三倍频、和频、差频&#xff09;、光学参量振荡&#xff08;OPO&#xff09;及电光调制等领域。宽透光范围三者均覆盖紫外…

Android APN加载耗时优化可行性分析

背景 根据Android系统底层机制和行业实践,本文讨论 APN 加载耗时从4.2s降至0.8s的数据合理性和技术可行性,需结合具体优化手段和硬件环境综合分析。 以下是关键判断依据及行业参考: ⚙️ 一、APN加载耗时基准参考 未优化场景的典型耗时 首次开机或重置后:APN需从apns-con…

mysql进阶-sql调优

概述优化索引在MySQL初阶的课程中已经介绍了索引&#xff0c;我们知道InnoDB存储引擎使⽤B树作为索引默认的数据结构来组织数据&#xff0c;为频繁查询的列建⽴索引可以有效的提升查询效率&#xff0c;那么如何利⽤索引编写出⾼效的SQL查询语句&#xff1f;以及如何分析某个查询…

海量数据处理问题详解

1.从a&#xff0c;b两个文件各存放50亿个url&#xff08;每个url大小为64B&#xff09;&#xff0c;如何在内存为4G中查找a&#xff0c;b中相同的url 计算各文件存放大小&#xff1a;50亿*64B 大约为320G&#xff0c;而内存只有4G&#xff0c;显然存放不下&#xff0c;此时我们…

AI 记忆管理系统:工程实现设计方案

本文档为《从“健忘”到“懂我”&#xff1a;构建新一代AI记忆系统》中所述理念的详细工程实现方案。它将聚焦于技术选型、模块设计、数据流转和核心算法&#xff0c;为开发团队提供清晰的落地指引。 1. 系统架构与技术选型 为实现分层记忆与读写分离的设计理念&#xff0c;我们…

Linux驱动学习day26天(RS485)

一、原理通过芯片将232信号转换成485信号&#xff0c;485表示0和1的方法&#xff1a;Va - Vb 的电压差在2~6V时表示1&#xff0c;Va - Vb 的电压差在-2~-6V时表示0。这样传输不容易受到干扰&#xff0c;并且传输距离长。我们需要做的事情就是发送&#xff1a;使能DE(driver ena…

从零构建TransformerP1-了解设计

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读和评论&#x1f604;。 目录引言1 概念回顾1.1 序列任务1.1.1 将序列变成模型…

JVM 终止机制详解:用户线程与守护线程

用户线程未执行完是否会阻止 JVM 终止&#xff1f;答案是&#xff1a;取决于线程类型。让我详细解释&#xff1a; 核心规则 #mermaid-svg-bg5xpyMAeRWNGGk2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bg5xpyMAe…

Linux Vim 常用快捷键

Vim中最常用的快捷键&#xff0c;熟练掌握它们可以大大提高编辑效率。移动光标h- 左移j- 下移k- 上移l- 右移w- 移动到下一个单词开头b- 移动到上一个单词开头e- 移动到单词末尾0- 移动到行首$- 移动到行尾gg- 移动到文件开头G- 移动到文件末尾:n- 跳转到第n行插入模式i- 在光标…

【Bellman负环】Cycle Finding

题目翻译给定一个有向图&#xff0c;你的任务是判断它是否包含负环&#xff0c;并给出这样一个环的示例。输入 第一行输入两个整数 n 和 m&#xff1a;分别表示节点数和边数。节点编号为 1, 2, ..., n。 接下来 m 行描述边&#xff0c;每行有三个整数 a, b, c&#xff1a;表示存…

数据结构(六):树与二叉树

一、树的基本概念树的定义树&#xff08;Tree&#xff09;是由 n&#xff08;n ≥ 0&#xff09;个节点组成的有限集合&#xff0c;当 n 0 时称为空树。非空树中&#xff1a;有且仅有一个根节点&#xff08;Root&#xff09;&#xff1b;其余节点可以划分为若干个互不相交的子…

《Linux运维总结:Shell 脚本日志输出工具》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;Linux运维实战总结 一、Shell 脚本日志输出工具 1、提供的 logger() 函数是一个非常实用的 Shell 脚本日志输出工具&#xff0c;它支持带时间戳和…

select ... for update阻塞

总结阻塞规则&#xff1a;当前事务持有的锁 (来自 SELECT ... FOR UPDATE)其他事务尝试的操作是否会被阻塞&#xff1f;原因排他锁 (X Lock) 在行 R 上SELECT ... FROM ... (普通查询)否读快照 (MVCC)&#xff0c;不需要锁排他锁 (X Lock) 在行 R 上SELECT ... FROM ... FOR UP…

LangChain4j终极指南:Spring Boot构建企业级Agent框架

LangChain4j Spring Boot 构建企业级 Agent 框架深度指南&#xff08;3000字终极版&#xff09;一、架构设计&#xff1a;面向未来的企业级智能体系统1.1 分层架构设计1.2 核心组件职责1.3 企业级特性设计二、核心模块深度实现2.1 智能体协作引擎&#xff08;LangGraph4j高级应…

前端基础之《Vue(29)—Vue3 路由V4》

一、安装1、命令cnpm install vue-router42、配置映射为src路径&#xff08;1&#xff09;安装对应配置cnpm install types/node&#xff08;2&#xff09;配置vite.config.tsimport { defineConfig } from vite import vue from vitejs/plugin-vue import * as path from &quo…

9.2 通过DuEDrawingControl把eDrawing嵌入到C#中显示

本文介绍如何通过DuEDrawingControl控件在C#的WPF中进行3D的显示。 DuEDrawingControl在实际应用中可以应用于以下场景: 1.CAD文件预览:在Winform或WPF应用程序中,用户可以预览装配文件、工程图文件等,方便进行设计和审核。 2.打印管理:控件支持打印文件的管理,用…