前言
在 Spring Boot 中,Configuration 等同於應用程式的設定中心,可以用來管理:系統參數、資料庫連線、Port 設定、環境變數、不同環境(dev / test / prod)等等。Spring Boot 讓您可以將設定外部化,從而可以在不同的環境中使用相同的應用程式程式碼。您可以使用各種外部設定來源,包括 Java 屬性檔案、YAML 檔案、環境變數和命令列參數。您可以在這些檔案中定義應用程式或微服務在啟動時所需的所有配置和屬性。
問題
預設情況下,Spring Boot 應用程式會尋找您在 application.properties 檔案(application.yml)中定義的設定或屬性,並將該檔案放在了類別路徑中。
但是,如果您嘗試在屬性檔案中指定屬性或配置,則會將所有內容與原始程式碼綁在一起。因此,這種方法可能不太有效。這就是為什麼 Spring Boot 也支援其他方法來覆寫在 Application.properties 檔案中定義的預設值。
以下列出在 Spring Boot 應用程式中提供配置的最常用方法
Spring Boot 支援多種配置方式,優先順序(由高到低):
- Command Line Arguments (命令行參數)
- Java System Properties
- OS Environment Variables (環境變數)
- External Config Files (如專案外的 application.yml)
- Internal Config Files (專案內的 application.properties/yml)
注意! Spring Boot 有設定覆蓋機制
例如:
application.yml 設定檔
讀取 application.yml
%java target/accounts-0.0.1-SNAPSHOT.jar --server.port=9999
會覆蓋 application.yml 的 port 設定
命令列參數 --server.port=9999, 覆蓋 application.yml 的 port 8070 設定
如何讀取配置值
在代碼中讀取屬性的方法,有三種常用的方法。
第一種方法 是使用 @Value 註解。簡單、直觀、適合少量設定、支援預設值
例如:
@Value("${property.name:defaultValue}")
private String propertyValue;
第二種方法 使用環境變數介面。動態讀取設定、可手動控制、支援預設值、可取得 Profile。
例如:
@Autowired
private Environment environment;
public String getProperty() {
String propertyValue = environment.getProperty("property.name");
return propertyValue;
}
第三種方法 @ConfigurationProperties。結構化管理、適合大型專案、型別安全
例如:
application.yml
app:
payment:
api-key: "sk_test_51Mz..."
port: 8080
base-url: "https://api.example.com"
Java
@Data
@Validated
@ConfigurationProperties(prefix = "app.payment")
public class PaymentProperties {
@NotBlank
private String apiKey;
@Min(1000)
@Max(9999)
private int port;
private String baseUrl;
}
以下簡單條列差異,方便實務參考
註:
動態讀取: 這三者在 Spring Boot 預設下都是啟動時決定。但在純 Spring Boot 下,Environment 能最直接拿到當下 Context 的值。
留言