阿里开源框架Jarslink1.6.1新特性

简介: 阿里开源框架Jarslink1.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也因此保留了下来。


目录
相关文章
|
6月前
|
数据采集 机器学习/深度学习 编解码
视频生成框架EasyAnimate正式开源!
EasyAnimate是人工智能平台PAI自主研发的DiT-based视频生成框架,它提供了完整的高清长视频生成解决方案,包括视频数据预处理、VAE训练、DiT训练、模型推理和模型评测等。可以使用EasyAnimate进行任意风格视频模型的训练和推理,还可以在预训练模型的基础上,通过少量图片的LoRA微调来改变生成视频的风格。
|
7月前
|
前端开发 Java 数据库连接
35个项目,开源,开源!
35个项目,开源,开源!
802 0
35个项目,开源,开源!
|
6月前
|
SQL 前端开发 程序员
拥抱开源,构建未来:王嘉树与 TDengine 的开源之旅
在当代的技术浪潮中,开源文化不仅催生了无数创新技术,也为广大技术爱好者提供了一个展示才华、相互学习的平台。我们今天采访到的这位北京邮电大学电子工程学院的研究生,就是在这样的背景下,通过开源活动不断探索、学习并实现自我突破的典型代表,他就是王嘉树。
60 0
业界新标杆!阿里开源自研高并发编程核心笔记(2023最新版)
提到并发编程很多人就会头疼了;首先就是一些基础概念:并发,并行,同步,异步,临界区,阻塞,非阻塞还有各种锁全都砸你脸上,随之而来的就是要保证程序运行时关键数据在多线程中的可见性、核心业务的原子性、多线程通信的有序性。虽然很多人工作可能接触不到这些的东西,但是面试就是得问。假如你跟一个有过高并发编程经验的人一起面试同一个岗位,你就是背了些面试题,而人家是确确实实有真东西的,那后续的录用结果想必就不用我多说了吧~
|
消息中间件 缓存 运维
云HIS源码:JAVA开发采用主流技术栈
云HIS系统技术框架: 总体框架: SaaS应用,全浏览器访问 前后端分离,多服务协同 服务可拆分,功能易扩展 云HIS系统技术细节: 前端:Angular+Nginx 后台:Java+Spring,SpringBoot,SpringMVC,SpringSecurity,MyBatisPlus,等 数据库:MySQL + MyCat 缓存:Redis+J2Cache 消息队列:RabbitMQ 任务调度中心:XxlJob 接口技术:RESTful API + WebSocket + WebService 报表组件:itext + POI + ureport2 数据库
258 0
云HIS源码:JAVA开发采用主流技术栈
|
人工智能 自动驾驶
MiniGPT4,开源了!
MiniGPT4,开源了!
359 0
|
Cloud Native 开发者
云原生应用插件扩展训练营上线,帮你开始开源社区贡献者之旅!
阿里云开发者学堂联合云原生开发平台推出了云原生应用插件扩展训练营,帮你开始开源社区贡献者之旅!
云原生应用插件扩展训练营上线,帮你开始开源社区贡献者之旅!
|
Java API Apache
阿里巴巴开源框架JarsLink
JarsLink是一个基于JAVA的模块化开发框架,它提供在运行时动态加载模块(JAR包)、卸载模块和模块间调用的API,它能够帮助你进行模块化开发,也能帮助你的系统在运行时动态添加新功能,减少编译、打包和部署带来的发布耗时,同时它也是阿里巴巴的开源项目之一 https://github.com/alibaba/jarslink,目前在微贷事业群各团队广泛使用。
14369 0
|
弹性计算 Dubbo Java
开源领域服务
开源领域服务
136 0
|
负载均衡 Dubbo 应用服务中间件
蚂蚁金服开源-SofaRpc源码学习篇
一个service,一个client,一个注册中心。 service注册自己到registry注册中心,包括service-name,还有相应的ip,port,然后client去监听注册中心,然后拿到service的地址,调用的时候会通过生成一个代理,去invoke调用结果返回
890 0
蚂蚁金服开源-SofaRpc源码学习篇

热门文章

最新文章