欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot中使用configtree讀取樹形文件目錄中的配置詳解

 更新時(shí)間:2023年12月31日 08:46:55   作者:理想萬(wàn)歲萬(wàn)萬(wàn)歲  
這篇文章主要介紹了SpringBoot中使用configtree讀取樹形文件目錄中的配置詳解,configtree通過(guò)spring.config.import?+?configtree:前綴的方式,加載以文件名為key、文件內(nèi)容為value的配置屬性,需要的朋友可以參考下

一、介紹

相信絕大多數(shù)使用springboot開發(fā)項(xiàng)目的朋友們?cè)谔砑优渲脮r(shí),通常都是通過(guò)以下幾種方式:

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

但無(wú)論通過(guò)哪種方式,其配置的形式都是通過(guò)在配置文件中通過(guò)key - value的形式添加具體配置的,且配置文件類型為yaml或properties。如下所示:

properties文件內(nèi)容示例

key1 = value1

yaml文件內(nèi)容示例

key1: value1

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

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

如文件名為username的內(nèi)容如下:

admin

文件名為password的內(nèi)容如下:

123456

二、演示環(huán)境

本演示項(xiàng)目的環(huán)境如下:

  • java:1.8
  • springboot:2.4.3

三、項(xiàng)目演示

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

1. 配置文件

我們?cè)诒镜匚募到y(tǒng)中添加配置文件,其目錄結(jié)構(gòu)如下所示

  /
    etc/
      app/
        config/
          admin/
            username
            password
          db/
            username
            password
          nacos/
            username
            password

各個(gè)配置文件內(nèi)容如下所示

/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. 導(dǎo)入配置

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

注意,當(dāng)我們要添加以文件名為key,文件內(nèi)容為value的配置文件時(shí),必須在路徑前添加前綴configtree:,且路徑最后以/結(jié)尾。

另外,該路徑支持*通配符。

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

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

3. 檢測(cè)配置屬性

當(dāng)我們按照上面示例配置時(shí),由于在application.yml中配置的spring.config.import目錄為/etc/app/config/,因此我們可以通過(guò)admin.username、admin.password、db.username、db.password、nacos.username和nacos.password獲取對(duì)應(yīng)文件內(nèi)容的值。

下面我們啟動(dòng)項(xiàng)目對(duì)其進(jìn)行檢驗(yàn)。

啟動(dòng)項(xiàng)目:

在這里插入圖片描述

輸出:

在這里插入圖片描述

四、應(yīng)用場(chǎng)景

看到這里,想必很多小伙伴雖然知道springboot如何通過(guò)spring.config.import + configtree來(lái)讀取以文件名為key,文件內(nèi)容為value的配置,但是這種配置方式使用起來(lái)并不方便,且一個(gè)文件僅對(duì)應(yīng)一個(gè)配置屬性,那如果需要大量配置豈不是要?jiǎng)?chuàng)建大量文件?

其實(shí),使用該配置方式和使用application.yml方式應(yīng)該是相輔相成的,兩者應(yīng)當(dāng)配合使用。

當(dāng)我們?cè)谠破脚_(tái)(比如docker)上運(yùn)行應(yīng)用程序時(shí),有時(shí)需要讀取容器提供的配置值。而我們多數(shù)情況下都是通過(guò)該容器的環(huán)境變量來(lái)獲取所需的配置,但是如果我們可能會(huì)頻繁修改該環(huán)境變量或該變量需要加密時(shí),就可能暴露出它的缺點(diǎn)了。因?yàn)槿萜鞯沫h(huán)境變量是在創(chuàng)建鏡像的時(shí)候就確定的,當(dāng)我們需要修改該環(huán)境變量時(shí)就意味著已經(jīng)創(chuàng)建的容器需要?jiǎng)h除了。

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

五、源碼解析

springboot通過(guò)ConfigTreeConfigDataLocationResolver和StandardConfigDataLocationResolver兩種配置文件位置解析器來(lái)解析配置文件的位置,然后通過(guò)ConfigTreeConfigDataLoader和StandardConfigDataLoader來(lái)加載對(duì)應(yīng)配置文件中的配置內(nèi)容。

因此結(jié)合本文重點(diǎn),我們應(yīng)主要關(guān)注ConfigTreeConfigDataLocationResolver和ConfigTreeConfigDataLoader是如何解析配置文件的位置并從文件中讀取配置內(nèi)容的。

1. ConfigTreeConfigDataLocationResolver

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

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

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

private static final String PREFIX = "configtree:";
@Override
public boolean isResolvable(ConfigDataLocationResolverContext context, ConfigDataLocation location) {
    return location.hasPrefix(PREFIX);
}

解析配置文件的位置

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

@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 {
    // 目錄必須以“/結(jié)尾”
    Assert.isTrue(location.endsWith("/"),
                  () -> String.format("Config tree location '%s' must end with '/'", location));
    // 如果目錄不是通配符的形式,則直接根據(jù)該目錄獲取該目錄下文件的資源集合。
    if (!this.resourceLoader.isPattern(location)) {
        return Collections.singletonList(new ConfigTreeConfigDataResource(location));
    }
    // 如果目錄是通配符的形式,則對(duì)其進(jìn)一步處理,獲取該目錄下文件的資源集合。
    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是如何根據(jù)配置文件資源加載其內(nèi)容的。

在這里插入圖片描述

在加載配置屬性中,我們看到該方法主要分兩步

①根據(jù)文件資源獲取文件路徑path

②根據(jù)文件路徑獲取該文件中的配置。我們?cè)诜椒ńY(jié)束時(shí)添加斷點(diǎn),然后啟動(dòng)項(xiàng)目,讓代碼運(yùn)行到斷點(diǎn)處。如下圖所示,我們發(fā)現(xiàn)springboot已經(jīng)按照預(yù)期將各個(gè)配置文件讀取成功了。

在這里插入圖片描述

任意點(diǎn)擊其中一個(gè)元素,可以看到配置文件中的內(nèi)容也已經(jīng)被加載了

在這里插入圖片描述

最后將其封裝到ConfigData對(duì)象中返回。

六、總結(jié)

  • 通過(guò)spring.config.import + configtree:前綴的方式,加載以文件名為key、文件內(nèi)容為value的配置屬性。
  • configtree:應(yīng)以/結(jié)尾。
  • 適用于代替在云平臺(tái)中讀取加密的系統(tǒng)環(huán)境變量的場(chǎng)景。

到此這篇關(guān)于SpringBoot中使用configtree讀取樹形文件目錄中的配置詳解的文章就介紹到這了,更多相關(guān)SpringBoot讀取文件目錄配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java JSON解析庫(kù)Alibaba Fastjson用法詳解

    java JSON解析庫(kù)Alibaba Fastjson用法詳解

    這篇文章主要介紹了java JSON解析庫(kù)Alibaba Fastjson用法,結(jié)合實(shí)例形式詳細(xì)分析了java JSON解析庫(kù)Alibaba Fastjson的基本功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • Java和C++通過(guò)new創(chuàng)建的對(duì)象有何區(qū)別?

    Java和C++通過(guò)new創(chuàng)建的對(duì)象有何區(qū)別?

    Java和C++都是面向?qū)ο蟮木幊陶Z(yǔ)言,然而Java和C++在創(chuàng)建對(duì)象時(shí)卻存在不同的方式,由于方式的不同導(dǎo)致在內(nèi)存中管理的不同。這篇文章主要給大家介紹了關(guān)于Java和C++通過(guò)new創(chuàng)建對(duì)象區(qū)別的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-11-11
  • Java跳出多重嵌套循環(huán)過(guò)程解析

    Java跳出多重嵌套循環(huán)過(guò)程解析

    這篇文章主要介紹了Java跳出多重嵌套循環(huán)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • SpringMVC @RequestBody自動(dòng)轉(zhuǎn)json Http415錯(cuò)誤的解決

    SpringMVC @RequestBody自動(dòng)轉(zhuǎn)json Http415錯(cuò)誤的解決

    這篇文章主要介紹了SpringMVC @RequestBody自動(dòng)轉(zhuǎn)json Http415錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • java導(dǎo)出大批量(百萬(wàn)以上)數(shù)據(jù)的excel文件

    java導(dǎo)出大批量(百萬(wàn)以上)數(shù)據(jù)的excel文件

    這篇文章主要為大家詳細(xì) 介紹了java導(dǎo)出大批量即百萬(wàn)以上數(shù)據(jù)的excel文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Java配置win10環(huán)境變量過(guò)程圖解

    Java配置win10環(huán)境變量過(guò)程圖解

    這篇文章主要介紹了Java配置win10環(huán)境變量過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • IDEA中java斷言assert語(yǔ)法及使用

    IDEA中java斷言assert語(yǔ)法及使用

    這篇文章主要介紹了IDEA中java斷言assert語(yǔ)法詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • MyBatis-Plus通過(guò)version機(jī)制實(shí)現(xiàn)樂(lè)觀鎖的思路

    MyBatis-Plus通過(guò)version機(jī)制實(shí)現(xiàn)樂(lè)觀鎖的思路

    version機(jī)制的核心思想就是,假設(shè)發(fā)生并發(fā)沖突的幾率很低,只有當(dāng)更新數(shù)據(jù)的時(shí)候采取檢查是否有沖突,而判斷是否有沖突的依據(jù)就是version的值是否被改變了,這篇文章主要介紹了MyBatis-Plus通過(guò)version機(jī)制實(shí)現(xiàn)樂(lè)觀鎖的思路,需要的朋友可以參考下
    2021-09-09
  • java文件和目錄的增刪復(fù)制

    java文件和目錄的增刪復(fù)制

    這篇文章主要為大家詳細(xì)介紹了java文件和目錄的增刪復(fù)制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 必須詳細(xì)與全面的Java開發(fā)環(huán)境搭建圖文教程

    必須詳細(xì)與全面的Java開發(fā)環(huán)境搭建圖文教程

    本篇文章內(nèi)容包括:Linux理論與實(shí)操,MySQL實(shí)操,JDK實(shí)操,Tomcat實(shí)操和Tomcat實(shí)操,需要的朋友可以參考下
    2019-11-11

最新評(píng)論