SpringBoot中YAML配置文件用法及说明

 更新时间:2026年05月25日 10:13:58   作者:Vintanz  
SpringBoot项目中,YAML配置文件因其简洁语法和层级结构清晰等成为首选,本文详细介绍了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: 20
  address: 北京
# 对象配置(行内式)
user2: {name: 李四, age: 22, address: 上海}

3. 集合类型

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

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

示例:

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

代码中读取:

@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: 1001
  name: 张三
  address:
    - 北京
    - 上海
  1. 使用时直接注入实体类:
@Controller
public class UserController {
    @Autowired
    private UserConfig userConfig;  // 自动注入配置

    @GetMapping("/user")
    @ResponseBody
    public 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}  # 随机 UUID
  randomLong: ${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 包内。

六、常见问题与解决方案

配置不生效?

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

中文乱码?

  • 确保 YAML 文件编码为 UTF-8(IDEA 中可在 File -> Settings -> Editor -> File Encodings 中设置)。

如何区分多环境?

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

总结

YAML 以其简洁的语法和强大的表达能力,成为 Spring Boot 配置的优选格式。

掌握 YAML 的基础语法、数据类型映射及实战技巧,能显著提升配置文件的可读性和维护性。

在实际开发中,建议结合 @ConfigurationProperties 管理复杂配置,并合理利用多环境配置和优先级规则,让配置更加灵活高效。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java并发编程中的CyclicBarrier线程屏障详解

    Java并发编程中的CyclicBarrier线程屏障详解

    这篇文章主要介绍了Java并发编程中的CyclicBarrier线程屏障详解,
    2023-12-12
  • SpringBoot集成SwaggerUi以及启动时遇到的错误

    SpringBoot集成SwaggerUi以及启动时遇到的错误

    这篇文章主要介绍了SpringBoot集成SwaggerUi以及启动时遇到的错误,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java Collection集合的三种遍历方式详解

    Java Collection集合的三种遍历方式详解

    Collection集合遍历的方式有三种,迭代器foreach/增强for循环lambda表达式,这篇文章主要介绍了Java Collection集合的三种遍历方式,需要的朋友可以参考下
    2022-11-11
  • SpringBoot使用maven指定依赖包的版本(解决示例)

    SpringBoot使用maven指定依赖包的版本(解决示例)

    我们在使用A依赖的时候,这个依赖有引入了第三方B依赖,这时候我想指定B依赖的版本号,下面个大家分享解决示例,对SpringBoot maven依赖包相关配置方法感兴趣的朋友一起看看吧
    2024-04-04
  • 使用@Service注解出现No bean named 'xxxx' available]错误的解决

    使用@Service注解出现No bean named 'xxxx'&

    这篇文章主要介绍了使用@Service注解出现No bean named 'xxxx' available]错误的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • springboot整合mybatis-plus基于注解实现一对一(一对多)查询功能

    springboot整合mybatis-plus基于注解实现一对一(一对多)查询功能

    这篇文章主要介绍了springboot整合mybatis-plus基于纯注解实现一对一(一对多)查询功能,因为本人采用的是spring-boot进行开发,本身springboot就提倡采用不用配置自动配置的方式,所以真心希望mybatis(不是mybatis-plus)这点需要继续努力
    2021-09-09
  • 基于SSM框架实现简单的登录注册的示例代码

    基于SSM框架实现简单的登录注册的示例代码

    这篇文章主要介绍了基于SSM框架实现简单的登录注册的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • SpringBoot中手动开启数据库事务的四种方式

    SpringBoot中手动开启数据库事务的四种方式

    这篇文章给大家介绍SpringBoot中手动开启数据库事务的四种方式,每种方式结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-12-12
  • SpringBoot项目中JDK动态代理和CGLIB动态代理的使用详解

    SpringBoot项目中JDK动态代理和CGLIB动态代理的使用详解

    JDK动态代理和CGLIB动态代理都是SpringBoot中实现AOP的重要技术,JDK动态代理通过反射生成代理类,适用于目标类实现了接口的场景,性能较好,易用性高,但必须实现接口且不能代理final方法,CGLIB动态代理通过生成子类实现代理
    2025-03-03
  • java实现留言板功能实例

    java实现留言板功能实例

    这篇文章主要为大家详细介绍了JSP+JavaBean的留言板技术 ,JavaWeb登陆功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04

最新评论