掌握配置文件(一):精通`properties`与`yml`的语法及选择
摘要: 在上一章中,我们成功构建了第一个Web API,但其返回的内容是直接在Java代码中硬编码的。这种做法在真实项目中是不可取的,因为它缺乏灵活性。本章,我们将正式进入Spring Boot配置管理的核心领域,详细介绍两种主流的配置文件格式——传统的
properties
和现代的yml
(或yaml
)。我们将深入学习它们的语法、各自的优缺点,并最终帮助你根据不同的场景做出明智的选择。这是让你的应用从“写死”到“灵活配置”的关键一步。
引言:告别硬编码
回顾上一章,我们的ApiController
返回了一条固定的问候语。如果某天产品经理要求修改这条问候语,我们唯一的办法就是修改Java代码,重新编译、打包和部署。这显然是低效且僵化的。
专业的软件开发中,我们总是力求将易变的部分与稳定的代码分离开。应用程序的配置(如数据库地址、端口号、自定义文本等)就是典型的易变部分。Spring Boot提供了一套强大而灵活的配置机制,其核心就是位于src/main/resources
目录下的application.properties
或application.yml
文件。
本章的目标是:彻底搞懂properties
和yml
这两种配置文件的语法,并理解它们各自的适用场景,为后续的配置注入学习打下坚实基础。
一、配置文件的“大本营”:application.properties
当你使用Spring Initializr创建一个新项目时,默认生成的配置文件就是application.properties
。它位于src/main/resources
目录下,这是Spring Boot约定好的默认加载位置。
properties
文件采用的是经典的键值对(key-value) 格式,通过等号=
进行分隔。
1. 基本语法
# 这是注释,使用'#'号开头# 服务器端口号配置
server.port=8081# 应用名称
spring.application.name=my-first-app# 自定义配置:一个简单的字符串
app.greeting=Hello from properties file!# 自定义配置:包含空格的字符串
app.description=This is a great Spring Boot application.# 自-定义配置:引用其他配置
app.full-greeting=${app.greeting} Welcome to our community.
语法要点:
- 键值对:
key=value
。 - 注释: 以
#
或!
开头的行。 - 层级关系: 使用点
.
来表示配置项的层级结构,例如spring.application.name
。 - 值引用: 使用
${key}
的形式可以引用已经定义过的配置项的值。
2. 优点与缺点
- 优点:
- 语法简单直观,历史悠久,易于理解。
- 被Java生态广泛支持,许多老项目和工具都默认使用此格式。
- 缺点:
- 当配置项层级很深或数量很多时,会出现大量的重复前缀(如
spring.datasource.hikari...
),显得冗余。 - 无法很好地表达复杂的数据结构,如列表(List)或对象(Map)。
- 当配置项层级很深或数量很多时,会出现大量的重复前缀(如
二、现代化的选择:application.yml
YML
(发音 /ˈjæməl/,类似于 “camel”)是"YAML Ain’t Markup Language"(YAML不是一种标记语言)的递归缩写。它是一种以数据为中心的配置文件格式,近年来在云原生和微服务领域变得极其流行。
Spring Boot同样完美支持yml
格式。你只需将application.properties
重命名为application.yml
(或application.yaml
),Spring Boot就能自动识别并加载它。
1. 核心语法
yml
的核心是通过缩进和冒号来表示层级和键值关系。
# 服务器配置
server:port: 8082 # 端口号,注意冒号后面必须有一个空格# 应用配置
spring:application:name: my-first-app# 自定义配置
app:greeting: "Hello from yml file!" # 字符串可以加引号,也可以不加description: This is a great Spring Boot application.# 列表(数组)servers:- 192.168.1.100- 192.168.1.101- 192.168.1.102# 对象(Map)metadata:version: 1.0author: "CoderBO"contact:email: "coderbo@example.com"wechat: "coderbo-tech"
语法要点:
- 键值对:
key: value
。注意:
后面必须跟一个空格。 - 层级关系: 使用缩进表示。相同缩进级别的键属于同一层级。
- 列表(List/Array): 以
-
(减号+空格)开头的行,组成一个列表。 - 对象(Map): 键值对的自然组合就是对象。
- 注释: 同样使用
#
。
下面的图表清晰地对比了两种格式在表达相同配置时的差异:
2. 优点与缺点
- 优点:
- 语法简洁,结构清晰,可读性强,尤其在表达复杂配置时。
- 天然支持列表、对象等复杂数据结构。
- 消除了大量重复的前缀,文件更紧凑。
- 缺点:
- 对缩进敏感,错误的缩进会导致解析失败。
- 冒号后忘记加空格是初学者最常犯的错误。
三、如何选择:properties
vs yml
这是一个常见的“圣战”话题,但我们可以从实际角度出发来做决定。
特性 | application.properties | application.yml | 推荐场景 |
---|---|---|---|
可读性 | 一般,配置多时较差 | 极佳,层次分明 | yml 胜出 |
简洁性 | 较差,前缀冗余 | 极佳,无冗余 | yml 胜出 |
复杂结构 | 不支持 | 原生支持 | yml 胜出 |
上手难度 | 极低 | 低,需注意缩进 | properties 略易 |
生态兼容 | 极佳,传统标准 | 良好,现代主流 | properties 兼容性更广 |
结论:
- 对于新项目和追求高可读性的团队,强烈推荐使用
application.yml
。它的结构化能力是properties
无法比拟的。 - 对于需要兼容老旧系统或配置非常简单的项目,使用
application.properties
也完全没有问题。 - 可以共存:一个项目中可以同时存在这两种文件。Spring Boot会同时加载它们,并且
properties
文件中的配置优先级高于yml
文件中的同名配置。
总结
通过本章的学习,我们掌握了Spring Boot中两种核心配置文件的使用方法。我们不再是配置领域的门外汉,而是能够根据需求选择和编写合适的配置文件。
我们达成了以下目标:
- 精通
properties
语法:理解了其简单的键值对和点分层级结构。 - 精通
yml
语法:掌握了其通过缩进表示层级,以及定义列表和对象的核心能力。 - 做出明智选择:了解了两种格式的优缺点,并获得了在不同场景下如何选择的建议。
现在,我们已经学会了如何“定义”配置。但是,这些配置项如何被我们的Java代码“读取”和“使用”呢?
预告:定义配置只是第一步,真正的魔法在于如何将这些值注入到我们的程序中。下一章,我们将深入学习 掌握配置文件(二):使用
@Value
与@ConfigurationProperties
注入配置,看看Spring Boot是如何轻松地将配置文件中的值与Java对象的属性绑定在一起的。