本文總結了Spring Boot中容易混淆的環境變數應用優先順序以及管理作業系統環境變數的方法。
Spring Boot環境變數優先順序
- 啟動Spring Boot應用程式時傳遞的環境變數的應用程式優先順序如下。將考慮較高優先順序的環境變數,而較低階別的相同變數將被忽略。
1. JVM options: <font>"-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(<font>"SPRING_PROFILES_ACTIVE") ?: "defaultValue" }
|
方法2:@Value
同樣,您可以使用以下方式獲取並驗證Spring Boot的所有 bean 中應用的環境變數。@Value
@Component class FooComponent( @Value(<font>"\${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(<font>"SPRING_APPLICATION_NAME") ?: "foo" val SPRING_PROFILES_ACTIVE = System.getenv("SPRING_PROFILES_ACTIVE") ?: "local" } }
|