在 Spring Boot 中加載屬性文件的七種方法
環境:Spring Boot3.2.5
1. 簡介
在Spring Boot中,屬性文件通常用于將應用程序配置外部化。這使得我們能夠在一個集中位置管理應用程序在不同環境中的具體行為。屬性文件可以包含鍵值對,這些鍵值對配置應用程序的各個方面,如數據庫連接詳細信息、日志設置或特定于應用程序的參數。
在本篇文章中,我們將探討在 Spring Boot 中加載屬性文件的7種方法。
2. 實戰案例
2.1 在 Spring Boot 中加載屬性文件
Spring Boot支持從多個位置獲取屬性。對于一個普通的應用程序,會按照給定的順序考慮以下資源:
- 應用程序外部的application.properties / application.yml文件
- 在應用程序內部的application.properties / application.yml文件
- 操作系統環境變量
- Java系統屬性
- 命令行參數
當使用Spring配置文件時,應用程序還可以根據激活的配置文件加載特定于配置文件的屬性文件。可以通過`spring.profiles.active`屬性傳遞要激活的配置文件。特定于配置文件的`application-{profile}.properties`文件會優先于非特定于配置文件的屬性文件。
- 應用程序外的 application-{profile}.properties
- 應用程序外部的application.properties文件
- 應用程序內的 application-{profile}.properties
- 應用程序內的 application.properties
- 操作系統環境變量
- Java 系統屬性
- 命令行參數
2.2 應用程序外部加載屬性文件
默認情況下,Spring Boot會在項目的`src/main/resources`目錄中查找application.properties文件。然而,我們可以使用`spring.config.location`屬性來指定application.properties文件的外部位置。
如下,Spring Boot 從指定的外部位置(/home/app/application.properties)而不是默認位置加載 application.properties 文件。
java -jar myapp.jar --spring.config.location=/home/app/application.properties
另一種方法是,我們可以將application.properties文件包含在一個被包含在類路徑(classpath)中的目錄中。這樣做允許我們將application.properties文件與應用程序一起打包,但出于配置的目的,仍然可以將其外部化。
如下,Spring Boot會在類路徑中查找位于config目錄下的application.properties文件。我們可以將config目錄包含在打包后的JAR文件內,或者將其放在JAR文件外部的一個單獨目錄中。
java -jar myapp.jar --spring.config.additional-location=classpath:/config/
默認其實也是支持從類路徑下的/config/中加載配置文件。
2.3 從默認 application.properties 加載屬性
默認情況下,Spring Boot會在位于src/main/resources目錄下的application.properties或application.yml文件中查找屬性。我們可以使用鍵值對格式直接在這些文件中定義屬性。
spring.datasource.url=jdbc:mysql://localhost/mydb
spring.datasource.username=root
spring.datasource.password=xxxooo
Spring Boot 會自動加載這些文件中的屬性,并將其提供給應用程序。
2.4 加載特定于配置文件的屬性文件
此外,我們可以使用特定于配置文件的application.properties文件來定制應用程序在不同環境或部署場景下的行為。特定于配置文件的屬性文件被命名為application-{profile}.properties,其中{profile}是配置文件的名稱。
java -jar myapp.jar --spring.profiles.active=prod
這里,Spring Boot 激活了生產配置文件,并從 application-prod.properties 中加載屬性。
2.5 從自定義屬性文件中加載屬性
我們還可以通過使用@PropertySource注解指定自定義屬性文件的位置來從它們中加載屬性。這允許我們將配置拆分成多個文件或從外部位置加載屬性。
@Configuration
@PropertySource("classpath:pack.properties")
public class CustomConfiguration {
@Value("${pack.app.title}")
private String title ;
}
你可以定義為數組形式加載多個配置文件,也可以使用@PropertySources配置多個。
2.6 通過環境變量傳遞/覆蓋屬性
如果我們只考慮一個或兩個屬性,Spring Boot允許我們使用環境變量來覆蓋這些屬性。環境變量提供了一種無需修改屬性文件即可配置應用程序的方法,從而更容易地在不同環境中管理配置。
export SPRING_DATASOURCE_URL=jdbc:mysql://localhost/mydb
這里的spring.datasource.url屬性被SPRING_DATASOURCE_URL環境變量所覆蓋。
2.7 通過系統屬性傳遞/覆蓋屬性
類似于環境變量,我們可以使用系統屬性來覆蓋屬性。系統屬性可以使用JVM命令行選項(-Dproperty=value)或在應用程序中通過編程方式設置。
java -jar myapp.jar -Dspring.datasource.url=jdbc:mysql://localhost/mydb
請注意,系統屬性具有比屬性文件中或環境變量中定義的屬性更高的優先級。