1. 概述
本教程將介紹如何在 Spring Boot 的 <em >application.properties</em> 和 <em >application.yml</em> 中使用環境變量。 此外,我們還將學習如何在代碼中引用這些屬性。
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_BAELDUNG,其值為“Hello Baeldung”。 我們可以現在連接這兩個變量:
baeldung.presentation=${HELLO_BAELDUNG}. Java is installed in the folder: ${JAVA_HOME}該屬性 baeldung.presentation 現在包含以下文本:“Hello Baeldung. Java 已安裝在以下文件夾中:C:\Program Files\Java\jdk-11.0.14“。
這樣,我們的屬性值會根據環境而不同。
3. 在代碼中使用特定環境的屬性
鑑於我們已經啓動了 Spring 上下文,現在我們將看到如何將屬性值注入到我們的代碼中。
3.1. 使用 @Value</em/> 註解注入值
首先,我們可以使用 @Value</em/> 註解。 @Value</em/> 處理 setter、構造函數和字段注入。
@Value("${baeldung.presentation}")
private String baeldungPresentation;3.2. 從 Spring 環境獲取值
我們可以通過 Spring 的 Environment 獲取屬性值。我們需要使用自動裝配 (autowire) 實現:
@Autowired
private Environment environment;
// 獲取屬性值示例
String username = environment.getProperty("spring.profiles.active");
@Autowired
private Environment environment;屬性值現在可以通過 getProperty() 方法獲取:
environment.getProperty("baeldung.presentation")3.3. 使用 @ConfigurationProperties 組裝屬性
@ConfigurationProperties 註解在我們需要將屬性分組時非常有用。 我們將定義一個 Component,用於收集所有具有給定前綴的屬性,在本例中是 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. 從環境變量中加載多個屬性
從 Spring Boot 3.5.0-M2 開始, 我們現在可以從單個環境變量中加載多個配置屬性。 傳統上,我們通常為每個屬性定義單獨的環境變量。 現在, 例如,讓我們定義一個名為 DATABASE_CONFIG 的環境變量: 上述格式反映了在 application.properties 文件中使用的鍵值對結構。 或者,我們也可以使用 YAML 格式在環境變量中定義這些屬性: Spring Boot 支持在環境變量中使用 spring.config.import 屬性時,同時支持屬性格式和 YAML 格式的內容。 接下來,通過使用 spring.config.import 屬性,在 application.properties 文件中引用環境變量: 在這裏,我們使用 env 關鍵字,並指定環境變量名稱,從而提示 Spring Boot 從指定環境變量中加載屬性。 最後,我們使用數據庫配置中的一些屬性作為佔位符: 在上述代碼中,我們使用了 DATABASE_CONFIG 環境變量中定義的屬性,避免了將每個屬性定義為單獨的環境變量。 在本文中,我們學習瞭如何根據環境定義具有不同值的屬性,並在代碼中使用它們。此外,我們還了解了如何在 export DATABASE_CONFIG="
DATABASE_URL=jdbc:h2:mem:testdb
USERNAME=sa
PASSWORD=password
"export DATABASE_CONFIG=$(cat <<EOF
DATABASE_URL: jdbc:h2:mem:testdb
USERNAME: sa
PASSWORD: password
EOF
)spring.config.import=env:DATABASE_CONFIGspring.datasource.url=${DATABASE_URL}
spring.datasource.username=${USERNAME}
spring.datasource.password=${PASSWORD}6. 結論
<em >application.properties</em> 和 <em >application.yml</em> 文件中定義環境變量。最後,我們還查看了將定義的屬性注入到示例代碼中的示例。