# Springboot yml怎麼獲取系統環境變量的值

## 引言

在現代應用開發中,**配置管理**是至關重要的一環。Spring Boot作為Java生態中最流行的框架之一,提供了強大的配置管理能力,其中`application.yml`(或`application.properties`)是默認的配置文件格式。而將系統環境變量與YAML配置結合使用,可以實現更靈活的部署方案。本文將深入探討如何在Spring Boot的YAML配置中獲取系統環境變量的值。

---

## 目錄
1. [環境變量與配置的關係](#環境變量與配置的關係)
2. [YAML基礎語法回顧](#yaml基礎語法回顧)
3. [Spring Boot中引用環境變量](#spring-boot中引用環境變量)
   - [3.1 直接引用語法](#31-直接引用語法)
   - [3.2 默認值設置](#32-默認值設置)
   - [3.3 嵌套屬性引用](#33-嵌套屬性引用)
4. [操作系統環境變量設置](#操作系統環境變量設置)
   - [4.1 Linux/Mac](#41-linuxmac)
   - [4.2 Windows](#42-windows)
5. [高級用法](#高級用法)
   - [5.1 多環境配置](#51-多環境配置)
   - [5.2 自定義前綴](#52-自定義前綴)
   - [5.3 加密處理](#53-加密處理)
6. [調試與常見問題](#調試與常見問題)
7. [最佳實踐](#最佳實踐)
8. [總結](#總結)

---

## 環境變量與配置的關係

系統環境變量是操作系統級別的鍵值對存儲,具有以下特點:
- **全局可見性**:所有進程均可訪問
- **運行時注入**:無需修改代碼即可改變應用行為
- **安全性**:敏感信息可避免硬編碼

在Spring Boot中,環境變量的優先級高於`application.yml`中的配置(遵循[特定優先級規則](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config))。

---

## YAML基礎語法回顧

YAML(YAML Ain't Markup Language)是常用的配置文件格式,比Properties文件更具可讀性:

```yaml
server:
  port: 8080
  servlet:
    context-path: /api

對比Properties等效配置:

server.port=8080
server.servlet.context-path=/api

Spring Boot中引用環境變量

3.1 直接引用語法

在YAML中使用${VARIABLE_NAME}語法引用環境變量:

database:
  url: ${DB_URL}
  username: ${DB_USER}
  password: ${DB_PASSWORD}

當環境變量未設置時,啓動會報錯。可通過:指定默認值。

3.2 默認值設置

app:
  cache-size: ${CACHE_SIZE:100}  # 默認值100

3.3 嵌套屬性引用

spring:
  datasource:
    url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME}

操作系統環境變量設置

4.1 Linux/Mac

# 臨時設置
export DB_URL=jdbc:mysql://localhost:3306/mydb

# 永久設置(添加到~/.bashrc或~/.zshrc)
echo "export DB_USER=admin" >> ~/.bashrc
source ~/.bashrc

4.2 Windows

:: 臨時設置
set DB_PASSWORD=secret

:: 永久設置(系統屬性→高級→環境變量)

高級用法

5.1 多環境配置

結合spring.profiles.active使用:

# application-dev.yml
database:
  url: ${DEV_DB_URL}
  
# application-prod.yml  
database:
  url: ${PROD_DB_URL}

激活方式:

java -jar app.jar --spring.profiles.active=prod

5.2 自定義前綴

通過@ConfigurationProperties實現:

@Configuration
@ConfigurationProperties(prefix = "myapp")
public class AppConfig {
    private String apiKey;
    // getters & setters
}

YAML配置:

myapp:
  api-key: ${API_KEY}

5.3 加密處理

使用Jasypt等工具加密敏感數據:

database:
  password: ENC(${ENCRYPTED_DB_PASSWORD})

調試與常見問題

查看實際加載的配置:

@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args)
            .getEnvironment().getPropertySources().forEach(ps -> {
                System.out.println(ps.getName() + ": " + ps.getSource());
            });
    }
}

常見錯誤: 1. Could not resolve placeholder - 環境變量未設置且無默認值 2. 變量名大小寫不匹配(Linux區分大小寫) 3. 特殊字符未轉義


最佳實踐

  1. 敏感信息:永遠不要將密碼等寫入版本控制
  2. 命名規範:使用大寫+下劃線命名環境變量(如DB_HOST
  3. 文檔化:維護config/README.md説明必需的環境變量
  4. 容器化支持:Docker/K8s中通過envFrom注入

總結

通過本文我們系統學習了: - YAML中引用環境變量的基礎語法 - 多環境配置管理策略 - 實際部署時的操作系統設置 - 高級應用場景和調試技巧

掌握這些技能後,你的Spring Boot應用將獲得更強的環境適應能力,實現真正的”一次構建,到處運行”。