阿里开源框架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
模块A依赖于其余jar包中的bean B;框架
打包时该jar包被剔除或者打包后被删除;maven
父容器中提供一个与bean B相同定义的bean C;编辑器
模块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源创计划”,欢迎正在阅读的你也加入,一块儿分享。