Spring Boot 配置文件详解:YAML vs Properties

前言

在 Spring Boot 开发中,配置文件是应用运行的核心。无论是开发、测试还是生产环境,配置文件都起到了至关重要的作用。Spring Boot 提供了两种主流的配置文件格式:PropertiesYAML。它们各有特点,适用于不同的场景。

本文将从以下几个方面详细解析 Spring Boot 的配置文件:

  1. YAML 和 Properties 的区别与使用场景
  2. 多环境配置:管理开发、测试、生产环境的不同设置
  3. 自定义配置:使用 @Value@ConfigurationProperties 注解
  4. 配置文件优先级与外部化配置:了解配置文件的加载顺序和外部化管理

通过本文的学习,你将能够全面掌握 Spring Boot 的配置文件管理技巧,并在实际开发中灵活运用。


一、YAML 和 Properties 的区别与使用场景

1. Properties 文件

Properties 文件 是 Java 世界中最常见的配置文件格式,以其简单易用的特点广受欢迎。

  • 语法特点
    • 使用键值对的形式存储配置。
    • 每行一个配置项,键和值之间用 = 分隔。
    • 支持多行书写,使用 \ 表示续行。

示例:

复制代码
# application.properties  
server.port=8080  
spring.datasource.url=jdbc:mysql://localhost:3306/mydb  
  • 优点
    • 简单直观,易于上手。
    • 与 Java 生态系统深度集成。
  • 缺点
    • 不支持复杂的层级结构。
    • 对于嵌套配置不够友好。
2.YAML 文件

YAML 文件 是一种更为现代化的配置文件格式,因其简洁和强大的表达能力而备受青睐。

  • 语法特点
    • 使用缩进表示层级关系。
    • 支持多行字符串和复杂的数据结构(如列表、映射)。
    • 文件扩展名通常为 .yaml.yml

示例:

复制代码
# application.yaml  
server:
  port: 8080 
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb 
  • 优点
    • 支持复杂的层级结构,适合嵌套配置。
    • 语法简洁,易于阅读和维护。
  • 缺点
    • 对于简单的配置项显得略显冗长。
    • 学习成本稍高于 Properties。
3.YAML 和 Properties 的对比
特性 Properties YAML
文件扩展名 .properties .yaml.yml
语法风格 键值对,无层级结构 使用缩进表示层级结构
适用场景 简单的键值对配置 复杂的嵌套配置
是否支持多行 支持(使用 \ 续行) 支持(自然换行)
是否支持复杂结构 不支持 支持(列表、映射等)
4. 如何选择?
  • 如果你的配置较为简单(如单层键值对),可以选择 Properties
  • 如果你的配置较为复杂(如嵌套结构、列表等),建议选择 YAML

二、多环境配置:管理不同环境的设置

在实际开发中,应用通常需要在多个环境中运行(如开发环境、测试环境、生产环境)。Spring Boot 提供了灵活的多环境配置解决方案。

1. 配置文件命名规范

Spring Boot 支持通过在配置文件名后添加 -profile 后缀来区分不同环境。例如:

  • application.properties :默认配置文件。
  • application-dev.properties :开发环境配置。
  • application-test.properties :测试环境配置。
  • application-prod.properties :生产环境配置。
2. 激活指定 Profile

要激活某个 Profile,可以通过以下几种方式:

  1. 通过命令行参数

    复制代码
    java -jar myapp.jar  --spring.profiles.active=dev  

2 .通过系统环境变量

复制代码
export SPRING_PROFILES_ACTIVE=dev 

3.通过 application.properties 文件

复制代码
spring.profiles.active=dev  

三、自定义配置:使用 @Value@ConfigurationProperties

除了使用 Spring Boot 提供的默认配置外,我们还可以根据需求定义自己的配置项。

1. 使用 @Value 注解

@Value 是 Spring 提供的一个注解,用于从配置文件中读取值并注入到组件中。

示例:

java 复制代码
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.stereotype.Component; 
 
@Component 
public class MyConfig {
    
    @Value("${my.custom.property}") 
    private String customProperty;
 
    // Getter and Setter methods 
}

application.properties 中定义:

java 复制代码
my.custom.property=Hello,  World!
2.使用 @ConfigurationProperties 注解

@ConfigurationProperties 是 Spring Boot 提供的一个更强大的注解,适用于管理复杂的自定义配置。

java 复制代码
import org.springframework.boot.context.properties.ConfigurationProperties; 
import org.springframework.stereotype.Component; 
 
@Component 
@ConfigurationProperties(prefix = "my.custom") 
public class MyConfig {
    
    private String property1;
    private Integer property2;
 
    // Getters and Setters 
}

application.properties 中定义:

java 复制代码
my.custom.property1=Value1  
my.custom.property2=123  
3. 自定义配置类的优势
  • 类型安全:通过 POJO 类型进行数据绑定。
  • 文档生成:Spring Boot 可以为自定义配置生成文档。
  • 集中管理:便于管理和维护复杂的配置项。

四、配置文件优先级与外部化配置

1. 配置文件的加载顺序

Spring Boot 在加载配置文件时遵循一定的优先级规则。以下是默认的加载顺序:

  1. 命令行参数:最高优先级。
  2. 系统环境变量
  3. application.propertiesapplication.yaml 文件
  4. Profile 特定的配置文件(如 application-dev.properties
2. 配置文件的覆盖规则
  • 如果同名配置项在多个文件中出现,优先级高的文件会覆盖优先级低的文件。
  • 命令行参数和系统环境变量具有最高优先级。
相关推荐
寻星探路2 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
崔庆才丨静觅3 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
曹牧4 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
passerby60614 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了4 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅4 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅4 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
爬山算法5 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7255 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎5 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven