1. 概述
在 Spring Boot 中,使用外部配置來定義我們的屬性是一種常見做法。這使得我們可以在不同的環境中同時使用相同的應用程序代碼。
我們可以使用屬性文件、YAML 文件、環境變量和命令行參數。
在本簡短教程中,我們將探討屬性文件和 YAML 文件之間的主要區別。
2. 屬性配置
默認情況下,Spring Boot 可以訪問在 application.properties 文件中設置的配置,該文件使用鍵值格式:
spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
spring.datasource.password=password每一行都是一個單獨的配置,因此我們需要使用相同的前綴來表達層次數據,即使用相同的鍵前綴。在此示例中,所有鍵都屬於 spring.datasource
2.1. 屬性中的佔位符
在我們的值中,我們可以使用帶有 ${} 語法的佔位符來引用其他鍵、系統屬性或環境變量的內容:
app.name=MyApp
app.description=${app.name} is a Spring Boot application2.2. 列表結構
如果具有相同類型的屬性但具有不同的值,我們可以使用數組索引來表示列表結構:
application.servers[0].ip=127.0.0.1
application.servers[0].path=/path1
application.servers[1].ip=127.0.0.2
application.servers[1].path=/path2
application.servers[2].ip=127.0.0.3
application.servers[2].path=/path32.3. 多環境配置
自 2.4.0 版本起,Spring Boot 支持創建多文檔屬性文件。 簡單來説,我們可以將單個物理文件分割成多個邏輯文檔。
這允許我們為每個需要聲明的環境定義文檔,所有文檔都位於同一個文件中:
logging.file.name=myapplication.log
bael.property=defaultValue
#---
spring.config.activate.on-profile=dev
spring.datasource.password=password
spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
bael.property=devValue
#---
spring.config.activate.on-profile=prod
spring.datasource.password=password
spring.datasource.url=jdbc:h2:prod
spring.datasource.username=prodUser
bael.property=prodValue請注意,我們使用 ‘#---’ 符號來指示文檔分割的位置。
在本示例中,我們有兩個具有不同 配置文件 的 Spring 部分。 此外,我們還可以擁有根級別的公共屬性集——在本例中,logging.file.name 屬性將在所有配置文件中保持一致。
2.4. 跨多文件 Profiles
作為一種替代方案,避免在同一個文件中擁有不同的 Profiles,我們可以將多個 Profiles 分佈在不同的文件中。在 2.4.0 版本之前,這是唯一可用的方法,用於 properties 文件。
我們通過在文件名中存儲 Profile 名稱來實現這一點,例如 application-dev.yml 或 application-dev.properties。
3. YAML 配置
YAML (YAML Ain't Markup Language) 是一種人類可讀的數據序列化格式。它通常用於配置文件中,但也用於其他領域,例如數據交換和對象持久化。 YAML 的主要優勢在於其易讀性和簡潔性,這使得它成為配置管理和數據存儲的理想選擇。
以下是一些 YAML 配置的關鍵概念:
- 鍵值對 (Key-Value Pairs): YAML 使用鍵值對來存儲數據。鍵和值之間用冒號
:分隔。 - 列表 (Lists): 列表用於存儲一系列的值。列表項使用縮進來表示,縮進級別表示列表的層級。
- 嵌套 (Nesting): YAML 支持嵌套鍵值對和列表,這使得可以表示複雜的數據結構。
示例 YAML 配置:
# 這是一個示例 YAML 文件
name: My Application
version: 1.0
author:
name: John Doe
email: john.doe@example.com
dependencies:
- library1
- library2
- library3
3.1. YAML 格式
除了 Java 的 properties 文件,我們還可以使用基於 YAML 的配置文件在我們的 Spring Boot 應用程序中使用。 YAML 是一種方便的格式,用於指定層次化的配置數據。
現在,讓我們從 properties 文件中的相同示例中轉換它到 YAML:
spring:
datasource:
password: password
url: jdbc:h2:dev
username: SA這比其屬性文件替代方案更易讀,因為它不包含重複的前綴。
3.2. 列表結構
YAML 針對列表的表達提供更簡潔的格式:
application:
servers:
- ip: '127.0.0.1'
path: '/path1'
- ip: '127.0.0.2'
path: '/path2'
- ip: '127.0.0.3'
path: '/path3'3.3. 多個配置文件
與屬性文件不同,YAML 默認支持多文檔文件,因此我們可以使用同一個文件存儲多個配置文件,無論使用哪個版本的 Spring Boot。
在這種情況下,規範表明需要使用 三個連字符來指示新文檔的開始:
logging:
file:
name: myapplication.log
---
spring:
config:
activate:
on-profile: staging
datasource:
password: 'password'
url: jdbc:h2:staging
username: SA
bael:
property: stagingValue注意:我們通常不希望在項目中同時包含標準 application.properties 和 application.yml 文件,因為這可能會導致意外結果。
例如,如果我們將上述(在 application.yml 文件中)的屬性與第 2.3 節中描述的屬性組合起來,則 bael.property 將被分配為 defaultValue,而不是具有特定於配置文件的值。這僅僅是因為 application.properties 在稍後加載,從而覆蓋到該點為止的所有分配值。
4. Spring Boot 使用
現在我們已經定義了我們的配置,接下來讓我們看看如何訪問它們。
4.1. 值註解
我們可以使用 @Value 註解注入我們屬性的值:
@Value("${key.something}")
private String injectedProperty;此處,key.something 屬性通過字段注入的方式注入到我們的一個對象中。
4.2. 環境抽象
我們還可以使用 環境 API 獲取屬性的值:
@Autowired
private Environment env;
public String getSomeKey(){
return env.getProperty("key.something");
}
4.3. 配置屬性註解
最後,我們還可以使用 @ConfigurationProperties 註解將我們的屬性綁定到類型安全且結構化的對象上:
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
String name;
String description;
...5. 結論
在本文中,我們瞭解到屬性和 Spring Boot 的 YAML 配置文件之間存在差異。我們還看到了它們的值可以引用其他屬性。最後,我們探討了如何將這些值注入到我們的運行時環境中。