在 Kotlin + Spring Boot 中使用环境变量

本文总结了Spring Boot中容易混淆的环境变量应用优先级以及管理操作系统环境变量的方法。

Spring Boot环境变量优先级

  • 启动Spring Boot应用程序时传递的环境变量的应用程序优先级如下。将考虑较高优先级的环境变量,而较低级别的相同变量将被忽略。

1. JVM options: "-D--spring.profiles.active=local"

2. Operating system environment variables:
"SPRING_PROFILES_ACTIVE=local"

3. application-{profile}.yml
----------------------------
spring:
  profiles:
    active: local

4. application.yml
------------------
spring:
  profiles:
    active: local

  • 从安全角度来看,将应用程序状态存储在源代码中(如 3 和 4 所示)并不是一个好方法。使用操作系统环境变量(如方法 2 所示)是将状态传递给容器的最推荐方法。(详细说明如下。)


方法1:Environment::getProperty()
在Spring Boot中,您可以按如下方式获取并验证所有 Spring Bean 中应用的环境变量。

@Component
class FooComponent(
    val environment: Environment
) {
    val springProfilesActive: String = environment.getProperty("SPRING_PROFILES_ACTIVE") ?: "defaultValue"
}


方法2:@Value
同样,您可以使用以下方式获取并验证Spring Boot的所有 bean 中应用的环境变量。@Value

@Component
class FooComponent(
    @Value("\${spring.profiles.active}") val springProfilesActive: String
) {
    ...
}


方法三:操作系统环境变量
管理操作系统环境变量是实际操作环境中最推荐的方法。无需在源代码中编写任何application.yml文件,在安全隔离的存储库中管理环境变量文件并通过CI/CD流程注入它们是最安全的管理方式。

$ nano foo-local.env
SPRING_APPLICATION_NAME=foo
SPRING_PROFILES_ACTIVE=local

创建的环境变量文件可以应用到本地开发环境中,如下:

$ nano run
#!/bin/bash
set -a; source foo-local.env; set +a
./gradlew bootRun

$ chmod +x run

  • 在IntelliJ IDEA开发环境中,可以使用EnvFile插件来应用它。安装插件后,在“编辑运行配置”菜单中选中“启用 EnvFile”,然后添加链接的env文件。
  • 注入的环境变量可以在代码级别获取,如下所示。它非常方便,因为它可以通过代码进行全局访问,而不仅仅是在 Spring Bean 中。

class Env {

    companion object {

        val SPRING_APPLICATION_NAME = System.getenv("SPRING_APPLICATION_NAME") ?: "foo"
        val SPRING_PROFILES_ACTIVE = System.getenv(
"SPRING_PROFILES_ACTIVE") ?: "local"
    }
}