最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java:Apache Commons Configuration2占位符使用方式

 更新時(shí)間:2025年12月28日 10:15:07   作者:10km  
Apache Commons Configuration2中的占位符功能允許在配置值中引用其他配置屬性或外部值,通過`${前綴:鍵名}`格式實(shí)現(xiàn),它提供了多種默認(rèn)的Lookup實(shí)現(xiàn),如base64編碼/解碼、日期格式化、環(huán)境變量、文件讀取等,此外,還支持自定義占位符實(shí)現(xiàn),以滿足特定需求

1. 占位符基本使用方式

在 Apache Commons Configuration2 中,占位符(Variable Interpolation)是一種強(qiáng)大的功能,允許在配置值中引用其他配置屬性或外部值。

占位符使用 ${前綴:鍵名} 的格式,其中:

  • 前綴:用于標(biāo)識使用哪個(gè) Lookup 實(shí)現(xiàn)來解析值
  • 鍵名:傳遞給 Lookup 實(shí)現(xiàn)的查找鍵

1.1 基本語法

占位符的基本格式為:

${前綴:鍵名}

例如,在配置文件中:

test.url=${classpath:cell-test.key}
test.runtime=${java:runtime}

1.2 工作原理

當(dāng)配置系統(tǒng)遇到占位符時(shí),會(huì)根據(jù)前綴查找對應(yīng)的 Lookup 實(shí)現(xiàn),然后調(diào)用其 lookup(String key) 方法獲取實(shí)際值。

這個(gè)過程在 ConfigurationReader 類中可以看到:

public class ConfigurationReader {
    public ConfigurationReader() {
        // 創(chuàng)建CombinedConfiguration
        this.combinedConfig = new CombinedConfiguration();
        // 設(shè)置表達(dá)式引擎為默認(rèn)表達(dá)式引擎
        this.combinedConfig.setExpressionEngine(DefaultExpressionEngine.instance());
        // 獲取StringLookup對象用于變量插值
        InterpolatorStringLookup interpolator = StringLookupFactory.INSTANCE.interpolatorStringLookup();
        // 注冊自定義的classpath前綴Lookup
        interpolator.registerLookup("classpath", ClasspathLookup.INSTANCE);
        // 為CombinedConfiguration設(shè)置變量插值器
        this.combinedConfig.setInterpolator(interpolator);
        // ...
    }
}

2. 默認(rèn)提供的占位符

Apache Commons Configuration2 通過 DefaultLookupsDefaultStringLookup 提供了多種默認(rèn)的占位符實(shí)現(xiàn)。

2.1 DefaultLookups 提供的占位符

DefaultLookups 是 Apache Commons Configuration2 中定義的枚舉類,提供了各種內(nèi)置的 Lookup 實(shí)現(xiàn):

前綴描述使用示例
base64DecoderBase64 解碼${base64Decoder:SGVsbG8gV29ybGQ=}
base64EncoderBase64 編碼${base64Encoder:Hello World}
const常量引用${const:java.io.File.separator}
date日期格式化${date:yyyy-MM-dd}
env環(huán)境變量${env:PATH}
file文件內(nèi)容${file:/path/to/file.txt}
javaJava 系統(tǒng)屬性${java:runtime}
localhost本地主機(jī)信息${localhost:name}
properties屬性文件${properties:config.properties:key}
resourceBundle資源綁定${resourceBundle:messages:greeting}
script腳本執(zhí)行${script:javascript:1+1}
sys系統(tǒng)屬性(同java)${sys:user.home}
urlURL內(nèi)容${url:http://example.com}
urlDecoderURL解碼${urlDecoder:https%3A%2F%2Fexample.com}
urlEncoderURL編碼${urlEncoder:https://example.com}
xmlXML內(nèi)容${xml:/path/to/file.xml:/root/child/text()}

2.2 DefaultStringLookup 提供的占位符

DefaultStringLookup 是 Apache Commons Text 庫中的枚舉類,為字符串查找提供了各種實(shí)現(xiàn):

鍵名對應(yīng)的查找器描述
base64DecoderBase64DecoderStringLookupBase64 解碼
base64EncoderBase64EncoderStringLookupBase64 編碼
constConstantStringLookupJava 常量引用
dateDateStringLookup日期格式化
envEnvironmentVariableStringLookup環(huán)境變量
fileFileStringLookup文件內(nèi)容讀取
javaJavaPlatformStringLookupJava 平臺信息
localhostLocalHostStringLookup本地主機(jī)信息
propertiesPropertiesStringLookup屬性文件讀取
resourceBundleResourceBundleStringLookup資源綁定
scriptScriptStringLookup腳本執(zhí)行
sysSystemPropertyStringLookup系統(tǒng)屬性
urlUrlStringLookupURL內(nèi)容讀取
urlDecoderUrlDecoderStringLookupURL解碼
urlEncoderUrlEncoderStringLookupURL編碼
xmlXmlStringLookupXML內(nèi)容讀取

3. 自定義占位符實(shí)現(xiàn)

3.1 實(shí)現(xiàn) Lookup 接口

要?jiǎng)?chuàng)建自定義占位符,需要實(shí)現(xiàn) Apache Commons Configuration2 的 Lookup 接口。

以下是 ClasspathLookup 的實(shí)現(xiàn)示例:

public class ClasspathLookup implements Lookup {
    public static final ClasspathLookup INSTANCE = new ClasspathLookup();
    
    @Override
    public Object lookup(String variable) {
        if(Strings.isNullOrEmpty(variable)) {
            return null;
        }
        URL resourceUrl = getClass().getClassLoader().getResource(variable);
        return (resourceUrl != null) ? resourceUrl : null;
    }
}

3.2 注冊自定義 Lookup

實(shí)現(xiàn) Lookup 接口后,需要將其注冊到配置系統(tǒng)中。在 ConfigurationReader 類中,可以看到如何注冊自定義 Lookup:

// 獲取StringLookup對象用于變量插值
InterpolatorStringLookup interpolator = StringLookupFactory.INSTANCE.interpolatorStringLookup();
// 注冊自定義的classpath前綴Lookup
interpolator.registerLookup("classpath", ClasspathLookup.INSTANCE);
// 為CombinedConfiguration設(shè)置變量插值器
this.combinedConfig.setInterpolator(interpolator);

3.3 使用自定義占位符

注冊后,可以在配置文件中使用自定義占位符。根據(jù) ClasspathLookupTest 的示例:

# 在cell-config.properties中定義
test.url=${classpath:cell-test.key}
test.url2=${classpath:nofound.key}
test.runtime=${java:runtime}

3.4 測試示例

以下是測試自定義占位符的示例代碼:

@Test
public void test1ClasspathLookup() {
    // 讀取通過classpath前綴定義的資源路徑(URL)
    String value = config.getString("test.url");
    log("value:{}", value);
    assertNotNull(value);
    assertNotEquals("${classpath:cell-test.key}", value); // 驗(yàn)證占位符已被解析
    
    // 讀取為URL類型
    URL urlValue = config.get(URL.class, "test.url");
    log("value:{}", urlValue);
    assertNotNull(urlValue);
    
    // 測試不存在的資源(應(yīng)保留原始占位符)
    String notFound = config.getString("test.url2");
    log("value:{}", notFound);
    assertEquals("${classpath:nofound.key}", notFound); // 資源不存在時(shí)保持原樣
}

4. 實(shí)現(xiàn)細(xì)節(jié)與注意事項(xiàng)

4.1 占位符解析行為

  • 當(dāng) Lookup 返回 null 時(shí),原始占位符字符串會(huì)被保留
  • 占位符可以嵌套使用
  • 默認(rèn)情況下,占位符使用 ${} 格式,可以自定義表達(dá)式引擎更改格式

4.2 ClasspathLookup 實(shí)現(xiàn)特點(diǎn)

  • 使用單例模式(INSTANCE 常量)
  • 對空輸入進(jìn)行處理,返回 null
  • 當(dāng)資源未找到時(shí)返回 null,而不是拋出異常
  • 返回 URL 對象,而不是路徑字符串

4.3 性能考慮

  • 頻繁使用的 Lookup 實(shí)現(xiàn)應(yīng)考慮使用緩存
  • 對于資源密集型操作,應(yīng)確保 Lookup 實(shí)現(xiàn)高效

5. 總結(jié)

Apache Commons Configuration2 的占位符機(jī)制提供了靈活強(qiáng)大的配置管理能力:

  1. 通過 ${前綴:鍵名} 格式在配置中引用外部值
  2. 內(nèi)置多種 Lookup 實(shí)現(xiàn)滿足常見需求
  3. 可以通過實(shí)現(xiàn) Lookup 接口輕松擴(kuò)展自定義占位符
  4. ClasspathLookup 展示了如何創(chuàng)建從類路徑加載資源的自定義占位符

通過合理使用占位符,可以構(gòu)建更加靈活、可維護(hù)的配置系統(tǒng),特別是在需要引用外部資源或環(huán)境變量的場景中。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

參考資料:

Apache Commons Configuration2 官方文檔

Apache Commons Text 官方文檔

相關(guān)文章

  • JavaWeb實(shí)現(xiàn)打印功能

    JavaWeb實(shí)現(xiàn)打印功能

    這篇文章主要介紹了JavaWeb實(shí)現(xiàn)打印功能的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-05-05
  • MyBatis入門程序

    MyBatis入門程序

    MyBatis是支持普通SQL查詢,存儲(chǔ)過程和高級映射的優(yōu)秀持久層框架。接下來本文給大家?guī)砹薓yBatis入門程序,感興趣的朋友一起學(xué)習(xí)吧
    2016-08-08
  • 如何解決java壓縮文件亂碼問題

    如何解決java壓縮文件亂碼問題

    在本篇文章中我們給大家分享的是一篇關(guān)于java壓縮文件亂碼問題的解決辦法,有需要的朋友們可以學(xué)習(xí)下。
    2019-12-12
  • 基于SpringBoot+SpringAI+Ollama開發(fā)智能問答系統(tǒng)

    基于SpringBoot+SpringAI+Ollama開發(fā)智能問答系統(tǒng)

    在人工智能技術(shù)飛速發(fā)展的今天,大語言模型(LLM)已成為開發(fā)者工具箱中不可或缺的一部分,本文將介紹如何利用SpringBoot、SpringAI框架結(jié)合Ollama本地大模型服務(wù),搭建一個(gè)完全運(yùn)行在本地Windows環(huán)境下的智能問答系統(tǒng),有需要的可以了解下
    2025-06-06
  • springboot項(xiàng)目攔截器重定向循環(huán)問題的解決

    springboot項(xiàng)目攔截器重定向循環(huán)問題的解決

    這篇文章主要介紹了springboot項(xiàng)目攔截器重定向循環(huán)問題的解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 詳談spring boot中幾種常見的依賴注入問題

    詳談spring boot中幾種常見的依賴注入問題

    這篇文章主要介紹了spring boot中幾種常見的依賴注入問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java集合之Map接口與實(shí)現(xiàn)類詳解

    Java集合之Map接口與實(shí)現(xiàn)類詳解

    這篇文章主要為大家詳細(xì)介紹了Java集合中的Map接口與實(shí)現(xiàn)類,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定的幫助,感興趣的可以了解一下
    2022-12-12
  • Java中如何取出String字符串括號中的內(nèi)容

    Java中如何取出String字符串括號中的內(nèi)容

    這篇文章主要介紹了Java中如何取出String字符串括號中的內(nèi)容問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • commons fileupload實(shí)現(xiàn)文件上傳的實(shí)例代碼

    commons fileupload實(shí)現(xiàn)文件上傳的實(shí)例代碼

    這篇文章主要介紹了commons fileupload實(shí)現(xiàn)文件上傳的實(shí)例代碼,包括文件上傳的原理分析等相關(guān)知識點(diǎn),本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-10-10
  • 深度剖析Java中的內(nèi)存原型及工作原理

    深度剖析Java中的內(nèi)存原型及工作原理

    這篇文章主要介紹了深度剖析Java中的內(nèi)存原型及工作原理,本文講解了java虛擬機(jī)內(nèi)存原型、常量池、Java內(nèi)存分配中的棧、Java內(nèi)存分配中的堆等內(nèi)容,需要的朋友可以參考下
    2015-01-01

最新評論

仁化县| 铜鼓县| 巴南区| 余姚市| 宜章县| 那坡县| 大同市| 邢台县| 唐海县| 新闻| 运城市| 无极县| 基隆市| 双江| 桃园市| 大洼县| 正安县| 大同市| 若尔盖县| 开封县| 中江县| 宁陵县| 大洼县| 兰考县| 安岳县| 易门县| 酒泉市| 石渠县| 高要市| 通道| 分宜县| 桃源县| 平罗县| 阜宁县| 通许县| 龙岩市| 丰顺县| 常德市| 休宁县| 呼伦贝尔市| 南丹县|