Spring?Boot分離配置文件的多種方式總結(jié)
今天聊一個小伙伴在星球上的提問:
問題不難,解決方案也有很多,因此我決定擼一篇文章和大家仔細(xì)說說這個問題。
1. 配置文件位置
首先小伙伴們要明白,Spring Boot 默認(rèn)加載的配置文件是 application.properties 或者 application.yaml,默認(rèn)的加載位置一共有五個,五個位置可以分為兩類:
從 classpath 下加載,這個又細(xì)分為兩種:
- 直接讀取 classpath 下的配置文件,對應(yīng)到 Spring Boot 項目中,就是 resources 目錄下的配置。
- 讀取 classpath:/config/ 目錄下的文件,對應(yīng)到 Spring Boot 項目中就是 resources/config 目錄下的配置。
這兩種情況如下圖:
從項目所在的當(dāng)前目錄下加載,這個又細(xì)分為三種情況:
- 從項目當(dāng)前目錄下加載配置文件。
- 從項目當(dāng)前目錄下的 config 文件夾中加載配置文件。
- 從項目當(dāng)前目錄下的 config 文件夾的子文件夾中加載(孫子文件夾不可以)。
這三種情況如下圖:
config 目錄下的配置文件可以被加載,config/a 目錄下的配置文件也可以被加載,但是 config/a/b 目錄下的配置文件不會被加載,因為不是直接子文件夾。
配置文件可以放在這么多不同的位置,如果同一個屬性在多個配置文件中都寫了,那么后面加載的配置會覆蓋掉前面的。例如在 classpath:application.yaml
中設(shè)置項目端口號是 8080,在 項目當(dāng)前目錄/config/a/application.yaml
中設(shè)置項目端口是 8081,那么最終的項目端口號就是 8081。
這是默認(rèn)的文件位置。
如果你不想讓自己的配置文件叫 application.properties 或者 application.yaml,那么也可以自定義配置文件名稱,只需要在項目啟動的時候指定配置文件名即可,例如我想設(shè)置我的配置文件名為 app.yaml,那么我們可以在啟動 jar 包的時候按照如下方式配置,此時系統(tǒng)會自動去上面提到的五個位置查找對應(yīng)的配置文件:
java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.name=app
如果項目已經(jīng)打成 jar 包啟動了,那么前面所說的目錄中,后三個中的項目當(dāng)前目錄就是指 jar 包所在的目錄。
如果你不想去這五個位置查找,那么也可以在啟動 jar 包的時候明確指定配置文件的位置和名稱,如下:
java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.location=optional:classpath:/app.yaml
注意,我在 classpath 前面加上了 optional:
表示如果這個配置文件不存在,則按照默認(rèn)的方式啟動,而不會報錯說找不到這個配置文件。如果不加這個前綴,那么當(dāng)系統(tǒng)找不到指定的配置文件時,就會拋出 ConfigDataLocationNotFoundException
異常,進(jìn)而導(dǎo)致應(yīng)用啟動失敗。
如果配置文件和 jar 包在相同的目錄結(jié)構(gòu)下,如下圖:
那么啟動腳本如下:
java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.location=optional:javaboy/app.yaml
如果 spring.config.location 的配置,只是指定了目錄,那么必須以 / 結(jié)尾,例如上面這個啟動腳本,也可以按照如下方式啟動:
java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.location=optional:javaboy/ --spring.config.name=app
通過 spring.config.location 屬性鎖定配置文件的位置,通過 spring.config.name 屬性鎖定配置文件的文件名。
2. 額外位置
前面我們關(guān)于配置文件位置的設(shè)置,都是覆蓋掉已有的配置,如果不想覆蓋掉 Spring Boot 默認(rèn)的配置文件查找策略,又想加入自己的,那么可以按照如下方式指定配置文件位置:
java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.additional-location=optional:javaboy/app.yaml
如果這個額外指定的配置文件和已有的配置文件有沖突,那么還是以后來者為準(zhǔn)。
3. 位置通配符
有一種情況,假設(shè)我有 redis 和 mysql 的配置,我想將之放在兩個不同的文件夾中以便于管理,像下面這樣:
那么在項目啟動時,可以通過通配符 * 批量掃描相應(yīng)的文件夾:
java -jar boot_config_file-0.0.1-SNAPSHOT.jar --spring.config.location=optional:config/*/
使用通配符批量掃描 mysql 和 redis 目錄時,默認(rèn)的加載順序是按照文件夾的字母排序,即先加載 mysql 目錄后加載 redis 目錄。
需要注意的是,通配符只能用在外部目錄中,不可以用在 classpath 中的目錄上。另外,包含了通配符的目錄,只能有一個通配符
*
,不可以有多個,并且還必須是以*/
結(jié)尾,即一個目錄的最后部分可以不確定。
4. 導(dǎo)入外部配置
從 Spring Boot2.4 開始,我們也可以使用 spring.config.import
方法來導(dǎo)入配置文件,相比于 additional-location
配置,這個 import 導(dǎo)入更加靈活,可以導(dǎo)入任意名稱的配置文件。
spring.config.import=optional:file:./dev.properties
甚至,這個 spring.config.import
還可以導(dǎo)入無擴展名的配置文件,例如我有一個配置文件,是 properties 格式的,但是這個這個配置文件沒有擴展名,現(xiàn)在我想將之作為 properties 格式的配置文件導(dǎo)入,方式如下:
spring.config.import=optional:file:/Users/sang/dev[.properties]
好啦,看完上面的內(nèi)容,文章一開始的問題答案就不用我多說了吧~
總結(jié)
到此這篇關(guān)于Spring Boot分離配置文件的多種方式的文章就介紹到這了,更多相關(guān)SpringBoot分離配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)較大二進(jìn)制文件的讀、寫方法
本篇文章主要介紹了Java實現(xiàn)較大二進(jìn)制文件的讀、寫方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Java數(shù)據(jù)結(jié)構(gòu)之紅黑樹的真正理解
這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)之紅黑樹的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11xxl-job 帶參數(shù)執(zhí)行和高可用部署方法
這篇文章主要介紹了xxl-job 帶參數(shù)執(zhí)行和高可用部署,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04使用Idea快速搭建SpringMVC項目的詳細(xì)步驟記錄
這篇文章主要給大家介紹了關(guān)于使用Idea快速搭建SpringMVC項目的詳細(xì)步驟,Spring?MVC是一種基于MVC模式的框架,它是Spring框架的一部分,它提供了一種更簡單和更有效的方式來構(gòu)建Web應(yīng)用程序,需要的朋友可以參考下2024-05-05