溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

jarslink1.6.1高級(jí)特性使用是怎樣的

發(fā)布時(shí)間:2022-01-04 17:05:17 來(lái)源:億速云 閱讀:96 作者:柒染 欄目:大數(shù)據(jù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)jarslink1.6.1高級(jí)特性使用是怎樣的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

jarslink高級(jí)特性使用

jarslink更新1.6.1后新增了很多高級(jí)特性,下面我們來(lái)看下這些高級(jí)特性如何使用。

注解的使用

新版本加入了注解的支持,用戶只需要在構(gòu)建ModuleConfig的時(shí)候調(diào)用ModuleConfig.addScanPackage(String)方法即可,可以多次調(diào)用該方法來(lái)添加多個(gè)掃描包配置,該配置會(huì)被spring用來(lái)作為掃描包配置。

     

注解開啟后的一些注意事項(xiàng)

  • 開啟注解后如果想要同時(shí)使用xml定義bean,與在普通spring項(xiàng)目中一樣,只需要有一個(gè)配置類(該類需要在spring的掃描路徑中),即注解為@Configuration的類,然后在該類上注解@ImportResource("你的spring bean定義xml文件位置")即可,需要注意的是,由于此種方式限于spring的實(shí)現(xiàn),xml中定義的bean不能依賴于注解定義的bean,而注解定義的bean則可以依賴于xml中定義的bean。

  • 如過(guò)通過(guò)注解的方式定義了一個(gè)name值與xml中name值相同的bean,那么注解定義的bean將會(huì)被xml中定義的bean所取代。

     

可以實(shí)現(xiàn)但是不推薦使用的

如果注解中依賴的bean在運(yùn)行時(shí)不存在(也就是該bean是在maven中引入模塊的,但是設(shè)置的scope是test或者provide等會(huì)在編譯期排除掉的),那么此時(shí)可以在父容器中定義一個(gè)相同的bean,此時(shí)該模塊A依然可以使用該bean。描述如下:

  1. 模塊A依賴于其他jar包中的bean B;

  2. 打包時(shí)該jar包被剔除或者打包后被刪除;

  3. 父容器中提供一個(gè)與bean B相同定義的bean C;

  4. 模塊A在父容器中運(yùn)行依然可以透明的使用bean B(其實(shí)此時(shí)是bean C提供的功能)

那如果父容器和模塊中同時(shí)定義了相同的bean呢?此時(shí)模塊中仍然會(huì)使用本模塊的bean而不會(huì)使用父容器中的bean。

如果不是必要的情況下請(qǐng)不要使用該功能

     

什么時(shí)候應(yīng)該優(yōu)先使用注解加載

如果模塊項(xiàng)目中存在這樣的情況:要引入的依賴jar包中存在spring bean的xml文件,位置和模塊項(xiàng)目中的一致,并且該xml文件是不需要的,那么此時(shí)使用xml的方式加載是無(wú)法排除該文件的,xml文件中的bean仍然會(huì)被加載,而使用注解的方式加載則不會(huì)存在該問(wèn)題(注解其實(shí)也有,如果掃描的包名一致的話也會(huì)出現(xiàn)類似問(wèn)題,但是正常來(lái)說(shuō)包名是不會(huì)與第三方j(luò)ar包一致的)。

     

多版本注冊(cè)功能

     

如何使用多版本功能

1.6.1版本支持同時(shí)注冊(cè)多個(gè)版本,該功能默認(rèn)關(guān)閉,如果需要開啟那么可以使用ModuleConfig.setNeedUnloadOldVersion(false)來(lái)開啟多版本功能。開啟后ModuleManager的register(Module)方法將可以注冊(cè)同一模塊的多個(gè)版本,不開啟則后注冊(cè)的會(huì)替換新注冊(cè)的模塊。

     

已知問(wèn)題

1.6.1版本的ModuleManager默認(rèn)實(shí)現(xiàn)存在并發(fā)問(wèn)題,即使開啟多版本功能,如果某個(gè)模塊在第一次注冊(cè)時(shí)同時(shí)兩個(gè)線程或者多個(gè)線程注冊(cè),那么此時(shí)有可能會(huì)丟失一些模塊,也就是有可能會(huì)有一個(gè)或多個(gè)模塊注冊(cè)失敗。該問(wèn)題將在下個(gè)版本修復(fù)。

該問(wèn)題只在該模塊第一次注冊(cè)時(shí)會(huì)出現(xiàn)該問(wèn)題,如果之前已經(jīng)注冊(cè)過(guò)該模塊之后并發(fā)注冊(cè)則不會(huì)有該問(wèn)題。

     

示例代碼

     

開啟注解

    ModuleLoader moduleLoader = null;
    ModuleManager moduleManager = null;
    ModuleConfig config = new ModuleConfig();
    //*************
    //配置config的其他選項(xiàng)
    //*************
    config.addScanPackage("com.alipay");
    //使用此配置加載Module將會(huì)遞歸掃描jar包中所有com.alipay目錄下的class
    Module module = moduleLoader.load(config);
             

使用多版本注冊(cè)功能

    ModuleConfig config = new ModuleConfig();
    //*************
    //配置config的其他選項(xiàng)
    //*************
    config.withName("demo").withVersion("1.0").withNeedUnloadOldVersion(false);
    Module module = moduleLoader.load(config);
    moduleManager.register(module);
    config.withName("demo").withVersion("2.0").withNeedUnloadOldVersion(false);
    module = moduleLoader.load(config);
    moduleManager.register(module);
    //此處該module的版本號(hào)為2.0,后注冊(cè)的module會(huì)被設(shè)置為默認(rèn)module
    module = moduleManager.find("demo");
    //通過(guò)指定版本號(hào)可以獲取到之前注冊(cè)的(因?yàn)?.0版本配置了允許存在多個(gè)版本的module,所以此時(shí)1.0版本的仍然能被找到)
    module = moduleManager.find("demo" , "1.0");
             

多版本注冊(cè)功能細(xì)節(jié)說(shuō)明(實(shí)現(xiàn)機(jī)制)

如果查看源碼可以得知,needUnloadOldVersion選項(xiàng)只在本次注冊(cè)中有效,也就是如果當(dāng)前注冊(cè)的模塊配置允許存在多版本,那么即使之前的模塊是不允許存在多版本也會(huì)忽略,僅僅使用本次注冊(cè)的模塊的配置,反之,如果之前模塊允許多版本存在,但是當(dāng)前注冊(cè)的模塊不允許,那么就會(huì)將之前的卸載了。當(dāng)前注冊(cè)的模塊不允許多版本存在時(shí)系統(tǒng)會(huì)如何卸載模塊呢?如果當(dāng)前注冊(cè)的模塊不允許存在多版本時(shí)只會(huì)將之前的默認(rèn)版本模塊刪除,并不會(huì)刪除其他模塊。詳情請(qǐng)看下列示例。

    ModuleConfig config = new ModuleConfig();
    //*************
    //配置config的其他選項(xiàng)
    //*************
    config.withName("demo").withVersion("1.0").withNeedUnloadOldVersion(true);
    Module module = moduleLoader.load(config);
    moduleManager.register(module);
    config.withName("demo").withVersion("2.0").withNeedUnloadOldVersion(false);
    module = moduleLoader.load(config);
    moduleManager.register(module);
     

上面這個(gè)例子最后系統(tǒng)將存在1.0版本和2.0版本的模塊

    ModuleConfig config = new ModuleConfig();
    //*************
    //配置config的其他選項(xiàng)
    //*************
    config.withName("demo").withVersion("1.0").withNeedUnloadOldVersion(true);
    Module module = moduleLoader.load(config);
    moduleManager.register(module);
    config.withName("demo").withVersion("2.0").withNeedUnloadOldVersion(false);
    module = moduleLoader.load(config);
    moduleManager.register(module);
     

上面這個(gè)例子最后系統(tǒng)將只存在2.0版本,1.0版本在2.0版本注冊(cè)時(shí)將會(huì)被卸載。

    ModuleConfig config = new ModuleConfig();
    //*************
    //配置config的其他選項(xiàng)
    //*************
    config.withName("demo").withVersion("1.0").withNeedUnloadOldVersion(true);
    Module module = moduleLoader.load(config);
    moduleManager.register(module);
    moduleManager.activeVersion("demo", "1.1");
	
    config.withName("demo").withVersion("2.0").withNeedUnloadOldVersion(false);
    module = moduleLoader.load(config);
    moduleManager.register(module);
     

上面這個(gè)例子最后仍然會(huì)同時(shí)存在1.0和2.0兩個(gè)版本,因?yàn)?.0版本注冊(cè)后系統(tǒng)將默認(rèn)demo模塊的默認(rèn)版本切換到了一個(gè)不存在的1.1版本,當(dāng)2.0版本的demo模塊注冊(cè)時(shí),雖然2.0版本配置的不允許存在多個(gè)版本存在,會(huì)將此時(shí)的默認(rèn)版本卸載,但是此時(shí)demo模塊的默認(rèn)版本是一個(gè)不存在的1.1,所以并不會(huì)有實(shí)際的版本會(huì)被卸載,1.0也因此保留了下來(lái)。

上述就是小編為大家分享的jarslink1.6.1高級(jí)特性使用是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI