声明
这个系列文章是翻译自https://www.baeldung.com/
原文地址:
因为版权的关系,本文禁止转载。
概述
Spring Boot 中的一个常见做法是 。这允许我们在不同的环境中使用相同的应用程序代码。
我们可以使用属性文件、YAML文件、环境变量和命令行参数。
在这个简短的教程中,我们将探索属性和YAML文件之间的主要区别。
Properties 配置
默认情况下,Spring Boot 可以访问文件 application.properties 中的配置信息,该文件使用键值格式:
spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
spring.datasource.password=password
这里的每一行都是一个单独的配置,所以我们需要通过使用相同的前缀来表示分层数据。在这个例子中,每个键都属于 spring.datasource。
Properties 中的占位符
在我们的值中,我们可以使用带有 ${} 语法的占位符来引用其他键、系统属性或环境变量的内容:
app.name=MyApp
app.description=${app.name} is a Spring Boot application
列表结构
如果我们有相同类型的属性和不同的值,我们可以用数组索引来表示列表结构:
application.servers[0].ip=127.0.0.1
application.servers[0].path=/path1
application.servers[1].ip=127.0.0.2
application.servers[1].path=/path2
application.servers[2].ip=127.0.0.3
application.servers[2].path=/path3
多个配置文件
从2.4.0版本开始,Spring Boot 支持创建多文档属性文件。简单地说,我们可以将单个物理文件拆分为多个逻辑文档。
这允许我们为需要声明的每个配置文件定义一个文档,所有这些都在同一个文件中:
logging.file.name=myapplication.log
bael.property=defaultValue
#---
spring.config.activate.on-profile=dev
spring.datasource.password=password
spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
bael.property=devValue
#---
spring.config.activate.on-profile=prod
spring.datasource.password=password
spring.datasource.url=jdbc:h2:prod
spring.datasource.username=prodUser
bael.property=prodValue
注意,我们使用#---
表示法来指示我们要在哪里拆分文档。
在本例中,我们有两个带有不同 profiles 标记的 Spring 部分。此外,我们还可以在根级别拥有一组公共属性——在本例中,logging.file.name 属性在所有配置文件中都是相同的。
跨多个文件的配置文件
作为在同一个文件中使用不同配置文件的替代方案,我们可以在不同的文件中存储多个配置文件。在版本2.4.0之前,这是属性文件唯一可用的方法。
我们通过将概要文件的名称放入文件名中来实现这一点-例如 application-dev.yml 或 application-dev.properties。
YAML 配置
YAML 格式
除了Java属性文件之外,我们还可以在Spring Boot 应用程序中使用基于YAML的配置文件。YAML是指定分层配置数据的方便格式。
现在,让我们从属性文件中获取相同的示例,并将其转换为YAML:
spring
datasource
password password
url jdbc h2 dev
username SA
这可能比其属性文件替代品更具可读性,因为它不包含重复前缀。
列表结构
YAML有一个更简洁的格式来表达列表:
application
servers
ip'127.0.0.1'
path'/path1'
ip'127.0.0.2'
path'/path2'
ip'127.0.0.3'
path'/path3'
多个配置文件
与属性文件不同,YAML通过设计支持多文档文件,这样,无论我们使用哪个版本的Spring Boot,我们都可以在同一个文件中存储多个配置文件。
然而,在这种情况下,规范表明我们必须使用三个破折号来表示新文档的开始:
logging
file
name myapplication.log
---
spring
config
activate
on-profile staging
datasource
password'password'
url jdbc h2 staging
username SA
bael
property stagingValue
注意:我们通常不希望在项目中同时包含标准的 application.properties 和 application.yml 文件,因为这可能会导致意想不到的结果。
例如,如果我们将上面显示的属性(在 application.yml 文件中)与第2.3节中描述的属性组合在一起则bael.property 将被分配以 defaultValue 而不是简档特定的值。这仅仅是因为 application.properties 稍后加载,覆盖了到那时为止分配的值。
Spring Boot 用法
现在我们已经定义了配置,让我们看看如何访问它们。
值注释
我们可以使用 @Value 注释注入属性的值:
"${key.something}")
(private String injectedProperty;
这里属性 key.something 通过字段注入(field injection)注入到我们的一个对象中。
环境抽象
我们还可以使用Environment API获取属性的值:
private Environment env;
public String getSomeKey(){
return env.getProperty("key.something");
}
ConfigurationProperties 注释
最后,我们还可以使用 @ConfigurationProperties 注释将属性绑定到类型安全的结构化对象:
prefix = "mail")
(public class ConfigProperties {
String name;
String description;
...
结论
在本文中,我们看到了 properties 和 yml Spring Boot配置文件之间的一些差异。我们还看到了它们的值如何引用其他属性。最后,我们研究了如何将值注入到运行时中。
和往常一样,所有的代码示例都可以在上找到。
文章评论