springboot使用configtree讀取樹形文件目錄中的配置

文章目錄

  • 一、介紹
  • 二、演示環境
  • 三、項目演示
    • 1. 配置文件
    • 2. 導入配置
    • 3. 檢測配置屬性
  • 四、應用場景
  • 五、源碼解析
    • 1. ConfigTreeConfigDataLocationResolver
    • 2. ConfigTreeConfigDataLoader
  • 六、總結

一、介紹

相信絕大多數使用springboot開發項目的朋友們在添加配置時,通常都是通過以下幾種方式:

  • 在classpath下添加application.yml或application.properties配置文件,或通過spring.config.location指定配置文件位置。
  • 通過spring.config.additional-location指定額外的配置文件位置。
  • 通過spring.config.import導入指定位置的配置文件。

但無論通過哪種方式,其配置的形式都是通過在配置文件中通過key - value的形式添加具體配置的,且配置文件類型為yamlproperties。如下所示:

  • properties文件內容示例

    key1 = value1
    
  • yaml文件內容示例

    key1: value1
    

其中key1作為配置名,value1作為配置值。

今天給大家介紹另一種配置形式,該配置使用文件名作為配置名,文件內容作為配置值

如文件名為username的內容如下:

admin

文件名為password的內容如下:

123456

二、演示環境

本演示項目的環境如下:

  • java:1.8
  • springboot:2.4.3

三、項目演示

本項目演示的是,在指定目錄中添加配置文件,并以文件名為key,文件內容為value;然后在application.yml配置文件中通過spring.config.import指定configtree將目錄中的所有配置文件添加到項目的環境中,并通過placeholder${}的形式獲取配置。

1. 配置文件

我們在本地文件系統中添加配置文件,其目錄結構如下所示

  /etc/app/config/admin/usernamepassworddb/usernamepasswordnacos/usernamepassword

各個配置文件內容如下所示

  • /etc/app/config/admin/username

    admin
    
  • /etc/app/config/admin/password

    123456
    
  • /etc/app/config/db/username

    mysql
    
  • /etc/app/config/db/password

    123456
    
  • /etc/app/config/nacos/username

    nacos
    
  • /etc/app/config/nacos/password

    nacos
    

2. 導入配置

application.yml配置文件中添加配置spring.config.import

注意,當我們要添加以文件名為key,文件內容為value的配置文件時,必須在路徑前添加前綴configtree:,且路徑最后以/結尾。另外,該路徑支持*通配符。

spring:config:import:- configtree:/etc/app/config/

如上所示,springboot將讀取路徑/etc/app/config/(包括子目錄)中的所有文件,并以文件名為key文件內容為value

3. 檢測配置屬性

當我們按照上面示例配置時,由于在application.yml中配置的spring.config.import目錄為/etc/app/config/,因此我們可以通過admin.usernameadmin.passworddb.usernamedb.passwordnacos.usernamenacos.password獲取對應文件內容的值。

下面我們啟動項目對其進行檢驗。

啟動項目:

在這里插入圖片描述

輸出:

在這里插入圖片描述

四、應用場景

看到這里,想必很多小伙伴雖然知道springboot如何通過spring.config.import + configtree來讀取以文件名為key,文件內容為value的配置,但是這種配置方式使用起來并不方便,且一個文件僅對應一個配置屬性,那如果需要大量配置豈不是要創建大量文件?

其實,使用該配置方式和使用application.yml方式應該是相輔相成的,兩者應當配合使用。

當我們在云平臺(比如docker)上運行應用程序時,有時需要讀取容器提供的配置值。而我們多數情況下都是通過該容器的環境變量來獲取所需的配置,但是如果我們可能會頻繁修改該環境變量或該變量需要加密時,就可能暴露出它的缺點了。因為容器的環境變量是在創建鏡像的時候就確定的,當我們需要修改該環境變量時就意味著已經創建的容器需要刪除了。

所以我們可以通過容器掛載卷的方式,將該環境變量保存在文件中,通過掛載卷將配置文件掛載到容器中。

五、源碼解析

在前面我們源碼分析springboot如何創建并配置環境3 - 配置擴展屬性2文章中,簡單介紹過springboot通過ConfigTreeConfigDataLocationResolverStandardConfigDataLocationResolver兩種配置文件位置解析器來解析配置文件的位置,然后通過ConfigTreeConfigDataLoaderStandardConfigDataLoader來加載對應配置文件中的配置內容。

因此結合本文重點,我們應主要關注ConfigTreeConfigDataLocationResolverConfigTreeConfigDataLoader是如何解析配置文件的位置并從文件中讀取配置內容的。

1. ConfigTreeConfigDataLocationResolver

首先我們查看ConfigTreeConfigDataLocationResolver是如何解析出配置文件目錄的,主要分兩步:①判斷配置的路徑是否滿足解析的條件,②解析配置文件的位置。

  • 判斷配置的路徑是否滿足解析的條件

    該判斷邏輯通過isResolvable()方法完成,主要判斷依據就是配置的spring.config.import值是否包含configtree:前綴,如果包含,則滿足條件。

    private static final String PREFIX = "configtree:";@Override
    public boolean isResolvable(ConfigDataLocationResolverContext context, ConfigDataLocation location) {return location.hasPrefix(PREFIX);
    }
    
  • 解析配置文件的位置

    該邏輯通過方法resolve()完成,其目的是根據配置的spring.config.import目錄轉換為該目錄下文件的資源。

    @Override
    public List<ConfigTreeConfigDataResource> resolve(ConfigDataLocationResolverContext context,ConfigDataLocation location) {try {return resolve(context, location.getNonPrefixedValue(PREFIX));}catch (IOException ex) {throw new ConfigDataLocationNotFoundException(location, ex);}
    }private List<ConfigTreeConfigDataResource> resolve(ConfigDataLocationResolverContext context, String location)throws IOException {// 目錄必須以“/結尾”Assert.isTrue(location.endsWith("/"),() -> String.format("Config tree location '%s' must end with '/'", location));// 如果目錄不是通配符的形式,則直接根據該目錄獲取該目錄下文件的資源集合。if (!this.resourceLoader.isPattern(location)) {return Collections.singletonList(new ConfigTreeConfigDataResource(location));}// 如果目錄是通配符的形式,則對其進一步處理,獲取該目錄下文件的資源集合。Resource[] resources = this.resourceLoader.getResources(location, ResourceType.DIRECTORY);List<ConfigTreeConfigDataResource> resolved = new ArrayList<>(resources.length);for (Resource resource : resources) {resolved.add(new ConfigTreeConfigDataResource(resource.getFile().toPath()));}return resolved;
    }
    

2. ConfigTreeConfigDataLoader

然后我們分析ConfigTreeConfigDataLoader是如何根據配置文件資源加載其內容的。

在這里插入圖片描述

在加載配置屬性中,我們看到該方法主要分兩步,①根據文件資源獲取文件路徑path,②根據文件路徑獲取該文件中的配置。我們在方法結束時添加斷點,然后啟動項目,讓代碼運行到斷點處。如下圖所示,我們發現springboot已經按照預期將各個配置文件讀取成功了。

在這里插入圖片描述

任意點擊其中一個元素,可以看到配置文件中的內容也已經被加載了

在這里插入圖片描述

最后將其封裝到ConfigData對象中返回。

六、總結

  • 通過spring.config.import + configtree:前綴的方式,加載以文件名為key、文件內容為value的配置屬性。
  • configtree:應以/結尾。
  • 適用于代替在云平臺中讀取加密的系統環境變量的場景。


紙上得來終覺淺,絕知此事要躬行。

————————————————我是萬萬歲,我們下期再見————————————————

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37502.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37502.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37502.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【從零學習python 】23. Python中集合(set)的使用方法和常見操作

文章目錄 set的使用創建格式添加元素移除元素set常見方法列表練習 進階案例 set的使用 集合&#xff08;set&#xff09;是一個無序的不重復元素序列&#xff0c;可以使用大括號 { } 或者 set() 函數創建集合。 注意&#xff1a;創建一個空集合必須用 set() 而不是 { }&#x…

母嬰即時零售行業數據可視化分析

對新晉父母來說&#xff0c;很多母嬰用品如同一位貼心的助手&#xff0c;為他們的寶寶提供溫暖和呵護。從嬰兒床墊到可愛的拼圖玩具&#xff0c;每一件用品都是為寶寶的成長和發展量身定制。對于繁忙的父母們而言&#xff0c;這些用品不僅幫助照顧孩子&#xff0c;更是為他們減…

一百五十一、Kettle——Linux上安裝的kettle8.2開啟carte服務以及配置子服務器

一、目的 kettle8.2在Linux上安裝好可以啟動界面、并且可以連接MySQL、Hive、ClickHouse等數據庫后&#xff0c;準備在Linux上啟動kettle的carte服務 二、實施步驟 &#xff08;一&#xff09;carte服務文件路徑 kettle的Linux運行的carte服務文件是carte.sh &#xff08;二…

手機兩個卡槽的正確使用方法,您用對了嗎?

手機上有兩個卡槽&#xff0c;該如何搭配才能使話費降到最低&#xff1f;你又是怎么搭配的&#xff1f; 這篇文章小編就來告訴你&#xff0c;如何在不換號的情況下&#xff0c;將自己的話費降到最低。 首先卡槽一我們就用8元保號套餐。 卡槽二&#xff0c;我們就可以辦理一張…

【C語言】每日一題(尋找數組的中心下標)

尋找數組的中心下標&#xff0c;鏈接奉上 方法 暴力循環前綴和 暴力循環 ???????思路&#xff1a; 依舊是我們的老朋友&#xff0c;暴力循環。 1.可以利用外層for循環&#xff0c;循環變量為數組下標&#xff0c;在循環內分別求出下標左邊與右邊的sum 2.在邊界時討論&…

JAVA 鼠標控制與鍵盤輸入控制

核心類&#xff1a;java.awt.Robot 該類是JDK定義的電腦系統的抽象類,可以用來模擬實現鼠標點擊與鍵盤輸入等信息 簡單實現一個自動搶票代碼&#xff1a; Robot rt new Robot();//可以認為是操作間隔的停歇時間&#xff0c;比如等待頁面加載&#xff0c;等彈框內容展示等 r…

vue tree禁用和多選變為單選

禁用的話和后臺協調一下&#xff0c;參數中多返回一個disabled 多選變單選 在tree結構中加入一個方法 <el-treeaccordion:data"deptOptions":props"defaultProps"show-checkbox:expand-on-click-node"false":filter-node-method"filte…

windows bat 腳本實現FTP自動下載上傳

windows bat 腳本實現FTP自動下載上傳 1. 自動下載 # 示例&#xff1a;實現自動下載 echo Off echo open 192.168.137.102>>ftp.txt echo admin>>ftp.txt echo admin12345>>ftp.txt echo lcd D:\>>ftp.txt echo cd /admin/1>>ftp.txt echo bin…

k8s整合istio配置gateway入口、配置集群內部服務調用管理

一、 istio gateway使用demo kubectl apply -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata:name: ngdemo-gatewaynamespace: ssx spec:selector:istio: ingressgateway # use Istio default gateway implementationservers:- port:numbe…

碼銀送書第五期《互聯網廣告系統:架構、算法與智能化》

廣告平臺的建設和完善是一項長期工程。例如&#xff0c;谷歌早于2003年通過收購Applied Semantics開展Google AdSense 項目&#xff0c;而直到20年后的今天&#xff0c;谷歌展示廣告平臺仍在持續創新和提升。廣告平臺是負有營收責任的復雜在線平臺&#xff0c;對其進行任何改動…

Mysql—修改用戶密碼(重置密碼)

Mysql—修改用戶密碼&#xff08;重置密碼&#xff09; 1、登錄mysql 1 2 [rootlocalhost ~]# mysql -uroot -p123456 [rootlocalhost ~]# mysql -hlocalhost -uroot -p123456 如果忘記密碼&#xff0c;則跳過MySQL的密碼認證過程。步驟如下&#xff1a; 修改Mysql配置文件…

TypeScript教程(三)變量聲明

一、變量聲明 變量是一種使用方便的占位符&#xff0c;用于引用計算機內存地址&#xff0c;可以將變量看做存儲數據的容器 命名規則&#xff1a; 1.變量名稱可以包含數字和字母 2.除了下劃線_和美元$符號外&#xff0c;不能包含其他特殊字符&#xff0c;包括空格 3.變量名…

使用GUI Guider工具在MCU上開發嵌入式GUI應用 (1) - GUI Guider簡介及安裝

使用GUI Guider工具在MCU上開發嵌入式GUI應用 (1) - GUI Guider簡介及安裝 受限于每篇文章最多只能貼9張圖的限制&#xff0c;這個教程被拆分成了多篇文章連載發布&#xff0c;完整目錄結構如下圖x所示。后續會發布完整教程的pdf文件&#xff0c;敬請期待。 圖x 完整教程文檔…

機器學習 | Python實現KNN(K近鄰)模型實踐

機器學習 | Python實現KNN(K近鄰)模型實踐 目錄 機器學習 | Python實現KNN(K近鄰)模型實踐基本介紹模型原理源碼設計學習小結參考資料基本介紹 一句話就可以概括出KNN(K最近鄰算法)的算法原理:綜合k個“鄰居”的標簽值作為新樣本的預測值。更具體來講KNN分類過程,給定一個訓…

網絡安全(自學)

想自學網絡安全&#xff08;黑客技術&#xff09;首先你得了解什么是網絡安全&#xff01;什么是黑客&#xff01; 網絡安全可以基于攻擊和防御視角來分類&#xff0c;我們經常聽到的 “紅隊”、“滲透測試” 等就是研究攻擊技術&#xff0c;而“藍隊”、“安全運營”、“安全…

無服務器架構發布啦!

導讀Serverless 1.15.2 已發布。The Serverless Framework (無服務器架構&#xff09;允許你自動擴展、按執行付費、將事件驅動的功能部署到任何云。 目前支持 AWS Lambda、Apache OpenWhisk、Microsoft Azure&#xff0c;并且正在擴展以支持其他云提供商。 Serverless 降低了…

nodejs+vue+elementui電影訂票網站系統_wqc3k

電影訂票系統在國內有很多值得借鑒的例子&#xff0c;功能也都趨于完善&#xff0c;因此此次電影訂票系統將輕量化開發&#xff0c;要完成以下功能&#xff1a; &#xff08;1&#xff09;要支持完整的用戶注冊&#xff0c;登錄功能&#xff0c;賬號的管理通過管理員來實現。 &…

PHP中的16個危險函數

php中內置了許許多多的函數&#xff0c;在它們的幫助下可以使我們更加快速的進行開發和維護&#xff0c;但是這個函數中依然有許多的函數伴有高風險的&#xff0c;比如說一下的16個函數不到萬不得已不盡量不要使用&#xff0c;因為許多“高手”可以通過這些函數抓取你的漏洞。 …

【Spring】核心容器——集合注入

1、集合種類 數組 List Set Map Properties 2、配置 <bean id"bookDao" class"dao.impl.BookDaoImpl"><property name"array"><array><value>2</value><value>4</value><value>6</value&g…

Docker升級后,出現Error response from daemon: Unknown runtime specified docker-runc

現象&#xff1a;docker升級版本后&#xff0c;重啟docker服務出現&#xff1a; [rootDocker scripts]# docker start registry Error response from daemon: Unknown runtime specified docker-runc Error: failed to start containers: registry解決辦法&#xff1a; 改完之…