這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)jarslink1.6.1高級(jí)特性使用是怎樣的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、網(wǎng)絡(luò)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、玉泉網(wǎng)站維護(hù)、網(wǎng)站推廣。
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)作為掃描包配置。
開啟注解后如果想要同時(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所取代。
如果注解中依賴的bean在運(yùn)行時(shí)不存在(也就是該bean是在maven中引入模塊的,但是設(shè)置的scope是test或者provide等會(huì)在編譯期排除掉的),那么此時(shí)可以在父容器中定義一個(gè)相同的bean,此時(shí)該模塊A依然可以使用該bean。描述如下:
模塊A依賴于其他jar包中的bean B;
打包時(shí)該jar包被剔除或者打包后被刪除;
父容器中提供一個(gè)與bean B相同定義的bean C;
模塊A在父容器中運(yùn)行依然可以透明的使用bean B(其實(shí)此時(shí)是bean C提供的功能)
那如果父容器和模塊中同時(shí)定義了相同的bean呢?此時(shí)模塊中仍然會(huì)使用本模塊的bean而不會(huì)使用父容器中的bean。
如果不是必要的情況下請(qǐng)不要使用該功能
如果模塊項(xiàng)目中存在這樣的情況:要引入的依賴jar包中存在spring bean的xml文件,位置和模塊項(xiàng)目中的一致,并且該xml文件是不需要的,那么此時(shí)使用xml的方式加載是無(wú)法排除該文件的,xml文件中的bean仍然會(huì)被加載,而使用注解的方式加載則不會(huì)存在該問題(注解其實(shí)也有,如果掃描的包名一致的話也會(huì)出現(xiàn)類似問題,但是正常來(lái)說(shuō)包名是不會(huì)與第三方j(luò)ar包一致的)。
1.6.1版本支持同時(shí)注冊(cè)多個(gè)版本,該功能默認(rèn)關(guān)閉,如果需要開啟那么可以使用ModuleConfig.setNeedUnloadOldVersion(false)來(lái)開啟多版本功能。開啟后ModuleManager的register(Module)方法將可以注冊(cè)同一模塊的多個(gè)版本,不開啟則后注冊(cè)的會(huì)替換新注冊(cè)的模塊。
1.6.1版本的ModuleManager默認(rèn)實(shí)現(xiàn)存在并發(fā)問題,即使開啟多版本功能,如果某個(gè)模塊在第一次注冊(cè)時(shí)同時(shí)兩個(gè)線程或者多個(gè)線程注冊(cè),那么此時(shí)有可能會(huì)丟失一些模塊,也就是有可能會(huì)有一個(gè)或多個(gè)模塊注冊(cè)失敗。該問題將在下個(gè)版本修復(fù)。
該問題只在該模塊第一次注冊(cè)時(shí)會(huì)出現(xiàn)該問題,如果之前已經(jīng)注冊(cè)過(guò)該模塊之后并發(fā)注冊(cè)則不會(huì)有該問題。
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);
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");
如果查看源碼可以得知,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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
新聞標(biāo)題:jarslink1.6.1高級(jí)特性使用是怎樣的
當(dāng)前地址:http://bm7419.com/article28/iiosjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、關(guān)鍵詞優(yōu)化、商城網(wǎng)站、小程序開發(fā)、定制開發(fā)、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)