Spring Boot 加載外部配置文件


Spring Boot 允許你從外部加載配置,這樣的話,就可以在不同的環境中使用相同的代碼。支持的外部配置源包括:Java屬性文件YAML文件環境變量命令行參數

@Value注解可以將屬性值直接注入到beans中。命令行參數以 -- 開頭

配置文件加載的順序如下:

  1. Application properties packaged inside your jar (application.properties and YAML variants)
  2. Profile-specific application properties packaged inside your jar (application-{profile}.properties and YAML variants)
  3. Application properties outside of your packaged jar (application.properties and YAML variants)
  4. Profile-specific application properties outside of your packaged jar (application-{profile}.properties and YAML variants)

應用程序啟動的時候,Spring Boot 會自動從以下位置查找並加載 application.propertiesapplication.yaml 文件:

  1. The classpath root
  2. The classpath /config package
  3. The current directory
  4. The /config subdirectory in the current directory
  5. Immediate child directories of the /config subdirectory

查找順序按優先級來,后面的可以覆蓋前面的。文件中的每一項會作為PropertySources被添加到Spring Environment

如果你不想用"application"作為配置文件名稱,可以在環境屬性中通過spring.config.name來指定。還可以使用spring.config.location來顯式指定配置文件的位置(文件路徑或目錄用逗號分隔)

注意,spring.config.name 和 spring.config.location 必須定義為一個環境屬性(通常是一個OS環境變量、一個系統屬性或一個命令行參數)

如果 spring.config.location 指定的是一個目錄,那么必須以 / 結尾

無論直接指定文件還是包含在目錄中,配置文件必須在其名稱中包含文件擴展名。通常,擴展名支持 .properties, .yaml, .yml

舉個栗子

指定單個文件

$ java -jar myproject.jar --spring.config.name=myproject

指定多個位置

$ java -jar myproject.jar --spring.config.location=optional:classpath:/default.properties,optional:classpath:/override.properties

默認情況下,如果指定的位置不存在,則會報錯。如果你不確定它是否存在,使用使用 optional: 前綴

例如:

optional:classpath:/custom-config/,optional:file:./custom-config/

Profile Specific Files

Spring Boot 會嘗試加載按照命名規約 application-{profile} 的文件,我們把這樣的文件稱為Profile-specific文件。

例如,如果你激活了一個名稱為prod的profile,並且使用YAML文件,那么 application.ymlapplication-prod.yml 都會被嘗試加載。

Profile-specific文件必須要和application.properties在相同的位置,而且profile-specific文件中的配置項會覆蓋非profile-specific文件中相同的配置項。如果有多個profile-specific文件被激活,則后面會覆蓋前面的。

舉個例子,假設spring.profiles.active=prod,live,那么application-prod.properties中的配置項會被application-live.properties中的同名配置項覆蓋。如果沒有明確指定激活哪個profile,則application-default會被考慮激活。

YAML 文件

考慮下面的配置文件

hello:
  world: "hehe"

my:
  roles:
    - "admin"
    - "guest"

轉換成properties文件應該是:

hello.world=hehe
my.roles[0]=admin
my.roles[1]=guest

Spring Framework提供了兩個方便的類,可以用來加載YAML文檔。YamlPropertiesFactoryBean 將 YAML 作為 Properties 加載,而 YamlMapFactoryBean 將 YAML 作為一個 Map 加載。

可以用@Value注解將屬性值注入到bean中

@Value("${hello.world}")
private String wahaha;

@Value("${my.roles[1]}")
private String roles1;

划重點

1、支持四種外部配置源:Java屬性文件、YAML文件、環境變量、命令行參數;
2、配置文件查找位置,依次為:
  (1) classpath 根路徑
  (2) classpath 根路徑下config目錄
  (3) jar包當前目錄
  (4) jar包當前目錄的config目錄
  (5) /config子目錄的直接子目錄
3、配置文件加載順序:
  (1) 當前jar包內部的application.properties和application.yml
  (2) 當前jar包內部的application-{profile}.properties 和 application-{profile}.yml
  (3) 引用的外部jar包的application.properties和application.yml
  (2) 引用的外部jar包的application-{profile}.properties 和 application-{profile}.yml
4、后面的可以覆蓋前面的同名配置項

https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config-files

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM