您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關jarslink1.6.1高級特性使用是怎樣的,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
jarslink更新1.6.1后新增了很多高級特性,下面我們來看下這些高級特性如何使用。
新版本加入了注解的支持,用戶只需要在構建ModuleConfig的時候調用ModuleConfig.addScanPackage(String)方法即可,可以多次調用該方法來添加多個掃描包配置,該配置會被spring用來作為掃描包配置。
開啟注解后如果想要同時使用xml定義bean,與在普通spring項目中一樣,只需要有一個配置類(該類需要在spring的掃描路徑中),即注解為@Configuration的類,然后在該類上注解@ImportResource("你的spring bean定義xml文件位置")即可,需要注意的是,由于此種方式限于spring的實現,xml中定義的bean不能依賴于注解定義的bean,而注解定義的bean則可以依賴于xml中定義的bean。
如過通過注解的方式定義了一個name值與xml中name值相同的bean,那么注解定義的bean將會被xml中定義的bean所取代。
如果注解中依賴的bean在運行時不存在(也就是該bean是在maven中引入模塊的,但是設置的scope是test或者provide等會在編譯期排除掉的),那么此時可以在父容器中定義一個相同的bean,此時該模塊A依然可以使用該bean。描述如下:
模塊A依賴于其他jar包中的bean B;
打包時該jar包被剔除或者打包后被刪除;
父容器中提供一個與bean B相同定義的bean C;
模塊A在父容器中運行依然可以透明的使用bean B(其實此時是bean C提供的功能)
那如果父容器和模塊中同時定義了相同的bean呢?此時模塊中仍然會使用本模塊的bean而不會使用父容器中的bean。
如果不是必要的情況下請不要使用該功能
如果模塊項目中存在這樣的情況:要引入的依賴jar包中存在spring bean的xml文件,位置和模塊項目中的一致,并且該xml文件是不需要的,那么此時使用xml的方式加載是無法排除該文件的,xml文件中的bean仍然會被加載,而使用注解的方式加載則不會存在該問題(注解其實也有,如果掃描的包名一致的話也會出現類似問題,但是正常來說包名是不會與第三方jar包一致的)。
1.6.1版本支持同時注冊多個版本,該功能默認關閉,如果需要開啟那么可以使用ModuleConfig.setNeedUnloadOldVersion(false)來開啟多版本功能。開啟后ModuleManager的register(Module)方法將可以注冊同一模塊的多個版本,不開啟則后注冊的會替換新注冊的模塊。
1.6.1版本的ModuleManager默認實現存在并發問題,即使開啟多版本功能,如果某個模塊在第一次注冊時同時兩個線程或者多個線程注冊,那么此時有可能會丟失一些模塊,也就是有可能會有一個或多個模塊注冊失敗。該問題將在下個版本修復。
該問題只在該模塊第一次注冊時會出現該問題,如果之前已經注冊過該模塊之后并發注冊則不會有該問題。
ModuleLoader moduleLoader = null; ModuleManager moduleManager = null; ModuleConfig config = new ModuleConfig(); //************* //配置config的其他選項 //************* config.addScanPackage("com.alipay"); //使用此配置加載Module將會遞歸掃描jar包中所有com.alipay目錄下的class Module module = moduleLoader.load(config);
ModuleConfig config = new ModuleConfig(); //************* //配置config的其他選項 //************* 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的版本號為2.0,后注冊的module會被設置為默認module module = moduleManager.find("demo"); //通過指定版本號可以獲取到之前注冊的(因為2.0版本配置了允許存在多個版本的module,所以此時1.0版本的仍然能被找到) module = moduleManager.find("demo" , "1.0");
如果查看源碼可以得知,needUnloadOldVersion選項只在本次注冊中有效,也就是如果當前注冊的模塊配置允許存在多版本,那么即使之前的模塊是不允許存在多版本也會忽略,僅僅使用本次注冊的模塊的配置,反之,如果之前模塊允許多版本存在,但是當前注冊的模塊不允許,那么就會將之前的卸載了。當前注冊的模塊不允許多版本存在時系統會如何卸載模塊呢?如果當前注冊的模塊不允許存在多版本時只會將之前的默認版本模塊刪除,并不會刪除其他模塊。詳情請看下列示例。
ModuleConfig config = new ModuleConfig(); //************* //配置config的其他選項 //************* 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);
上面這個例子最后系統將存在1.0版本和2.0版本的模塊
ModuleConfig config = new ModuleConfig(); //************* //配置config的其他選項 //************* 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);
上面這個例子最后系統將只存在2.0版本,1.0版本在2.0版本注冊時將會被卸載。
ModuleConfig config = new ModuleConfig(); //************* //配置config的其他選項 //************* 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);
上面這個例子最后仍然會同時存在1.0和2.0兩個版本,因為1.0版本注冊后系統將默認demo模塊的默認版本切換到了一個不存在的1.1版本,當2.0版本的demo模塊注冊時,雖然2.0版本配置的不允許存在多個版本存在,會將此時的默認版本卸載,但是此時demo模塊的默認版本是一個不存在的1.1,所以并不會有實際的版本會被卸載,1.0也因此保留了下來。
上述就是小編為大家分享的jarslink1.6.1高級特性使用是怎樣的了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。