baeldung 2022-08-02
1. 概述
在本教程中,我们将讨论如何在 Spring Boot 的 application.properties 和 application.yml 文件中使用环境变量。然后,我们将学习如何在代码中引用这些属性。
2. 在 application.properties 文件中使用环境变量
假设我们定义了一个名为 JAVA_HOME 的全局环境变量,其值为 "C:\Program Files\Java\jdk-11.0.14"。
要在 Spring Boot 的 application.properties 中使用该变量,需要用花括号将其包围:
java.home=${JAVA_HOME}
我们也可以以相同的方式使用系统属性。例如,在 Windows 上,默认定义了一个操作系统属性:
environment.name=${OS}
还可以组合多个变量的值。假设我们再定义一个环境变量 HELLO_MSM,其值为 "Hello Mianshima"。现在我们可以将这两个变量拼接起来:
msm.presentation=${HELLO_MSM}. Java is installed in the folder: ${JAVA_HOME}
此时,属性 msm.presentation 将包含以下文本:
Hello Mianshima. Java is installed in the folder: C:\Program Files\Java\jdk-11.0.14
通过这种方式,我们的属性可以根据运行环境的不同而具有不同的值。
3. 在代码中使用环境相关的属性
一旦启动了 Spring 上下文,我们就可以将属性值注入到代码中。以下是几种常用方式:
3.1. 使用 @Value 注入值
首先,可以使用 @Value 注解。它支持字段、构造函数和 setter 方法注入:
@Value("${msm.presentation}")
private String msmPresentation;
3.2. 从 Spring 的 Environment 中获取
也可以通过 Spring 的 Environment 对象获取属性值。需要先自动装配它:
@Autowired
private Environment environment;
然后,通过 getProperty() 方法获取属性值:
environment.getProperty("msm.presentation")
3.3. 使用 @ConfigurationProperties 分组属性
如果希望将多个相关属性分组管理,@ConfigurationProperties 注解非常有用。我们可以定义一个带有特定前缀(例如 msm)的组件,并为每个属性提供 setter 方法。在本例中,我们只有一个名为 presentation 的属性:
@Component
@ConfigurationProperties(prefix = "msm")
public class MsmProperties {
private String presentation;
public String getPresentation() {
return presentation;
}
public void setPresentation(String presentation) {
this.presentation = presentation;
}
}
接着,可以自动装配该配置类:
@Autowired
private MsmProperties msmProperties;
最后,通过对应的 getter 方法获取属性值:
msmProperties.getPresentation()
4. 在 application.yml 文件中使用环境变量
与 application.properties 类似,application.yml 也是用于定义应用程序各种属性和设置的配置文件。要使用环境变量,我们需要在属性占位符中声明其名称。
以下是一个 application.yml 示例,其中使用了属性占位符:
spring:
datasource:
url: ${DATABASE_URL}
上面的例子展示了如何在 Spring Boot 应用中引入数据库 URL。表达式 ${DATABASE_URL} 会提示 Spring Boot 查找名为 DATABASE_URL 的环境变量。
在 application.yml 中定义环境变量时,必须以美元符号 $ 开头,后跟左花括号 {、环境变量名和右花括号 }。这些组合构成了属性占位符。
此外,我们可以在代码中像使用 application.properties 一样使用这些环境相关的属性:可以通过 @Value 注解注入,也可以使用 Environment 类,或者使用 @ConfigurationProperties 注解。
5. 从单个环境变量加载多个属性
从 Spring Boot 3.5.0-M2 版本开始,我们现在可以从单个环境变量中加载多个配置属性。传统上,我们通常为每个属性分别定义环境变量;而现在,可以将相关属性整合到一个环境变量中。
例如,定义一个名为 DATABASE_CONFIG 的环境变量:
export DATABASE_CONFIG="
DATABASE_URL=jdbc:h2:mem:testdb
USERNAME=sa
PASSWORD=password
"
上述格式模仿了 application.properties 文件中使用的键值对结构。
或者,也可以使用 YAML 格式定义环境变量内容:
export DATABASE_CONFIG=$(cat <<EOF
DATABASE_URL: jdbc:h2:mem:testdb
USERNAME: sa
PASSWORD: password
EOF
)
Spring Boot 支持在使用 spring.config.import 属性时,从环境变量中加载 properties 格式 或 YAML 格式 的内容。
接下来,在 application.properties 文件中通过 spring.config.import 引用该环境变量:
spring.config.import=env:DATABASE_CONFIG
这里,我们使用 env 关键字加上环境变量名,指示 Spring Boot 从指定的环境变量中加载属性。
最后,在数据库配置中使用这些属性作为占位符:
spring.datasource.url=${DATABASE_URL}
spring.datasource.username=${USERNAME}
spring.datasource.password=${PASSWORD}
通过上述方式,我们使用了 DATABASE_CONFIG 环境变量中定义的属性,避免了为每个属性单独定义环境变量。
6. 结论
在本文中,我们学习了如何根据运行环境定义具有不同值的属性,并在代码中使用它们。此外,我们还了解了如何在 application.properties 和 application.yml 文件中定义环境变量。最后,我们通过示例展示了如何将这些已定义的属性注入到代码中。