如何在 Spring Boot 的配置文件中使用环境变量?

1. 概述

在本教程中,我们将讨论如何在 Spring Boot 的application.propertiesapplication.yml中使用环境变量。然后,我们将学习如何在代码中引用这些属性。
在这里插入图片描述

2. 在application.properties文件中使用环境变量

让我们定义一个名为JAVA_HOME的全局环境变量,其值为“ C:\Program Files\Java\jdk-11.0.14 ”。
要在 Spring Boot 的application.properties中使用此变量,我们需要用括号将其括起来:

java.home=${JAVA_HOME}

我们也可以以同样的方式使用系统属性。例如,在 Windows 上,默认定义了一个 OS 属性:

environment.name=${OS}

也可以组合多个变量值。让我们定义另一个环境变量HELLO_BAELDUNG,其值为“ Hello Baeldung ”。现在我们可以连接这两个变量:

baeldung.presentation=${HELLO_BAELDUNG}. Java is installed in the folder: ${JAVA_HOME}

属性baeldung.presentation 现在包含以下文本:
Hello Baeldung. Java is installed in the folder: C:\Program Files\Java\jdk-11.0.14 ”。

这样,我们的属性根据环境具有不同的值。

在这里插入图片描述

3. 在代码中使用我们环境特定的属性

假设我们启动了一个Spring 上下文,我们现在将看到如何将属性值注入到我们的代码中。

3.1. 使用@Value注入值

首先,我们可以使用**@Value**注释。@Value处理setter,构造函数和字段注入:

@Value("${baeldung.presentation}")
private String baeldungPresentation;

3.2. 从 Spring环境获取

我们还可以通过 Spring 的Environment获取属性的值。我们需要自动装配它:

@Autowired
private Environment environment;

现在可以通过getProperty()方法检索属性值:

environment.getProperty("baeldung.presentation")

3.3. 使用@ConfigurationProperties对属性进行分组

如果我们想要将属性组合在一起,@ConfigurationProperties注释非常有用。我们将定义一个组件,它将收集具有给定前缀的所有属性,在我们的例子中是baeldung。然后,我们可以为每个属性定义一个setter。setter的名称是属性名称的其余部分。在我们的例子中,我们只有一个,称为presentation:

@Component
@ConfigurationProperties(prefix = "baeldung")
public class BaeldungProperties {

    private String presentation;

    public String getPresentation() {
        return presentation;
    }

    public void setPresentation(String presentation) {
        this.presentation = presentation;
    }
}

我们现在可以自动连接BaeldungProperties对象:

@Autowired
private BaeldungProperties baeldungProperties;

最后,为了获取特定属性的值,我们需要使用相应的 getter:

baeldungProperties.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. 结论

在本文中,我们学习了如何根据环境定义具有不同值的属性并在代码中使用它们。此外,我们还了解了如何在application.properties和application.yml文件中定义环境变量。最后,我们查看了将定义的属性注入示例代码的示例。

### Spring Boot 多环境 Properties 文件配置 在Spring Boot项目中,为了适应不同的运行环境(如开发、测试、生产),可以创建多个`properties`文件来管理不同环境下的配置。这有助于保持项目的灵活性和可维护性。 #### 创建多环境配置文件 通常,在`src/main/resources/`目录下会有一个名为`application.properties`的默认配置文件[^2]。对于多环境支持,可以在同一目录内增加特定于各个环境的配置文件: - `application-dev.properties`: 开发环境专用配置; - `application-test.properties`: 测试环境专用配置; - `application-prod.properties`: 生产环境专用配置; 这些命名遵循了Spring Boot约定的名字模式——即`application-{profile}.properties`,其中`{profile}`代表具体的环境名称。 #### 设置激活的Profile 要指定哪个环境生效,可以通过多种方式设定活动的profile: 1. **命令行参数**: 使用`--spring.profiles.active={env}`启动应用时传递参数。 ```bash java -jar myapp.jar --spring.profiles.active=dev ``` 2. **JVM 参数**: `-Dspring.profiles.active={env}` ```bash java -Dspring.profiles.active=test -jar myapp.jar ``` 3. **操作系统环境变量**: SPRING_PROFILES_ACTIVE 4. **IDE 运行配置**: 如果是在IDE里调试,则可在其运行配置选项中设置相应的环境变量或程序参数。 当指定了某个profile作为活跃状态之后,Spring Boot将会加载对应名字的`.properties`文件中的配置项,并覆盖掉通用配置(`application.properties`)里的同名键值对。 #### 自定义属性示例 假设希望为博客服务定制一些基本信息,比如作者姓名和文章标题,那么可以在各环境中分别定义它们: ```properties # application-dev.properties com.kfit.blog.name=Alice Dev com.kfit.blog.title=Dev Guide to SpringBoot ``` ```properties # application-test.properties com.kfit.blog.name=Bob Test com.kfit.blog.title=Test Cases for SpringBoot Apps ``` ```properties # application-prod.properties com.kfit.blog.name=Charlie Prod com.kfit.blog.title=Production Ready SpringBoot Solutions ``` 以上配置允许应用程序根据不同环境展示适当的内容[^3]。 #### 获取自定义属性 为了让Java类能够读取上述配置的信息,可以利用`@Value`注解注入所需字段,或者更推荐的方式是通过构建一个POJO对象并配合`@ConfigurationProperties`来进行批量映射[^4]。 ```java import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class BlogInfo { @Value("${com.kfit.blog.name}") private String name; @Value("${com.kfit.blog.title}") private String title; // getters and setters... } ``` 这样就完成了基于不同环境切换相应配置的功能实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码到π退休

你的打赏是我精心创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值