阿里開源框架jarslink1.6.1高級特性使用

阿里開源框架jarslink高級特性使用


阿里開源框架jarslink更新1.6.1後新增了不少高級特性,下面咱們來看下這些高級特性如何使用。java

註解的使用

新版本加入了註解的支持,用戶只須要在構建ModuleConfig的時候調用ModuleConfig.addScanPackage(String)方法便可,能夠屢次調用該方法來添加多個掃描包配置,該配置會被spring用來做爲掃描包配置。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。描述以下:app

  1. 模塊A依賴於其餘jar包中的bean B;框架

  2. 打包時該jar包被剔除或者打包後被刪除;maven

  3. 父容器中提供一個與bean B相同定義的bean C;編輯器

  4. 模塊A在父容器中運行依然能夠透明的使用bean B(其實此時是bean C提供的功能)ide

那若是父容器和模塊中同時定義了相同的bean呢?此時模塊中仍然會使用本模塊的bean而不會使用父容器中的bean。flex

若是不是必要的狀況下請不要使用該功能

何時應該優先使用註解加載

若是模塊項目中存在這樣的狀況:要引入的依賴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也所以保留了下來。


沒有關注的能夠掃下方二維碼關注我,若是在閱讀過程當中有任何問題還能夠加我QQ1213812243詢問~



         

長按二維碼關注我吧

不要錯過




本文分享自微信公衆號 - java初學者(JoeKerouac_public)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索