Spring Boot 主要支持两种配置文件格式,它们允许你外部化应用程序的配置:.properties
文件和 .yml
(或 .yaml
) 文件。以下是关于这两种配置文件的关键知识点:
1. application.properties
文件
- 格式: 基于键值对的纯文本文件。
- 语法:
key=value
- 每一行通常表示一个配置项。
- 可以使用
#
或!
作为注释行的开头。
- 语法:
- 层级结构: 使用点 (
.
)符号来表示属性的层级关系。- 例如:
spring.datasource.url=jdbc:mysql://localhost/mydb
- 例如:
- 列表/数组: 可以通过在键名后使用方括号
[]
和索引来表示列表。- 例如:
my.list[0]=apple my.list[1]=banana
- 例如:
- 可读性: 对于简单的配置,可读性尚可。但对于复杂或嵌套层级较深的配置,可能会显得冗长且不易阅读。
- 特殊字符: 需要对某些特殊字符进行转义 (例如,
:
或=
在值中出现时)。 - 编码: 默认使用
ISO-8859-1
编码,如果需要使用其他编码(如UTF-8以支持中文),需要IDE或编辑器正确处理。
2. application.yml
(或 application.yaml
) 文件
- 格式: YAML (YAML Ain’t Markup Language),是一种人类可读的数据序列化标准。
- 语法: 使用缩进来表示层级关系和结构(通常是2个空格,不允许使用制表符 Tab)。
- 键值对使用冒号 (
:
) 分隔:key: value
(冒号后通常有一个空格)。
- 层级结构: 通过缩进自然地表达层级。
- 例如:
spring: datasource: url: jdbc:mysql://localhost/mydb
- 例如:
- 列表/数组: 使用连字符 (
-
) 开头表示列表项。- 例如:
my: list: - apple - banana
- 也可以内联表示:
my.anotherlist: [orange, grape]
- 例如:
- 可读性: 对于复杂和嵌套的配置数据,YAML 通常比
.properties
文件更简洁、更易读。 - 数据类型: 更直观地支持布尔值 (
true
/false
), 数字, 字符串 (通常不需要引号,除非包含特殊字符或为了清晰)。 - 多文档支持: 一个 YAML 文件可以通过
---
分隔符包含多个文档,这在Spring Boot中常用于定义不同Profile的配置于同一个文件中。
通用关键知识点 (适用于两者)
- 默认文件名: Spring Boot 会自动加载位于
src/main/resources
目录下的application.properties
或application.yml
文件。 - 加载优先级:
- 如果在同一目录下同时存在
application.properties
和application.yml
,.properties
文件中的配置会覆盖.yml
文件中的配置。 - Spring Boot 有一个详细的外部化配置加载顺序(包括命令行参数、环境变量、不同目录下的配置文件等),
src/main/resources
下的这些文件是其中的一部分。
- 如果在同一目录下同时存在
- Spring Profiles:
- 两种格式都支持通过特定的命名约定为不同的环境(如开发、测试、生产)定义不同的配置。
.properties
:application-{profile}.properties
(例如:application-dev.properties
).yml
:application-{profile}.yml
(例如:application-prod.yml
)- 也可以在单个
application.yml
文件中使用---
分隔并结合spring.config.activate.on-profile
(较新版本) 或spring.profiles
(较旧版本,不推荐用于多文档激活) 来指定不同profile的配置块。
- 通过
spring.profiles.active
属性来激活一个或多个profile。
- 两种格式都支持通过特定的命名约定为不同的环境(如开发、测试、生产)定义不同的配置。
- 属性覆盖: 高优先级的配置源可以覆盖低优先级的配置源。例如,命令行参数可以覆盖配置文件中的属性。
- 占位符 (Placeholders): 可以在配置文件中使用
${...}
形式的占位符来引用其他属性的值,或者系统属性、环境变量等。- 例如:
app.description=${app.name} is a Spring Boot application
- 例如:
- 配置绑定 (
@ConfigurationProperties
,@Value
):- Spring Boot 提供了强大的机制将配置文件中的属性值绑定到Java对象的字段上。
@Value("${my.property}")
用于注入单个属性值。@ConfigurationProperties(prefix = "my.config")
用于将一组属性绑定到一个POJO类。
- Spring Boot 提供了强大的机制将配置文件中的属性值绑定到Java对象的字段上。
- Relaxed Binding (宽松绑定): Spring Boot 在将环境变量或配置文件中的属性绑定到
@ConfigurationProperties
Bean时,支持多种命名方式的匹配 (例如,my.property-name
可以匹配MY_PROPERTY_NAME
环境变量或myPropertyName
Java Bean属性)。 - 位置: 除了
src/main/resources
,Spring Boot 还会从其他位置加载配置文件,例如:- 当前目录下的
/config
子目录 - 当前目录
- 类路径下的
/config
包 - 类路径根目录 (
src/main/resources
)
- 当前目录下的
选择与总结
- 简洁性与复杂配置: YAML 通常因其在处理复杂、层级化配置时的简洁性和可读性而受到青睐。
- 团队偏好: 选择哪种格式很多时候取决于团队的熟悉程度和偏好。
- Spring Boot的灵活性: Spring Boot 对两种格式都提供了一流的支持,可以根据项目需求灵活选择或甚至混合使用(尽管不常见)。
理解这些关键点有助于更有效地管理和维护Spring Boot应用程序的配置。