什么是jarslink
jarslink是阿里的开源框架,可以用来使模块分离,对不同的模块的代码进行部署不会影响其他模块的代码的运行。可以避免各个模块依赖的包的冲突。他的代码比较简单并且清晰明了,我们可以学习他们的代码,然后稍作修改,就能运用到我们自己的项目中。
源码分析
首先,我们可以看到jarslink的代码并不多,并且有很多测试类,我们就从测试类入手,看看他的运行步骤
可以分析一下下图这个测试类。他的大概逻辑就是组装一个ModuleConfig的对象,然后根据这个对象load出Module这个对象,Module就是当前模块的所有代码,然后从该模块里看是否有对应的action。那么重点就是 moduleLoader.load(config)这段代码了。
这段代码的主要逻辑就是获取该模块对应的jar的文件路径,然后组装成sping的容器,再返回一个SpringModule对象。可以看到该对象有自己的上下文信息,还有对应的actions
我们来看一下组装spring容器的代码,代码的逻辑就是new出来当前模块的classloader,然后切换当前线程的classloader,然后根据是注解还是xml方式,加载spring的上下文信息,并且设置一下父容器的信息,使得在当前模块中可以获取父容器的bean等信息。然后设置一下容器的classloader,刷新容器内容即可。
正因为各自的模块有各自的上下文信息,自己的classloader,所以使得模块间互相隔离,各自不会互相影响。jarslink的代码量很少,上述讲到的几个类与方法就是核心。如果我们需要有自己的定制化需求,完全可以依据他的逻辑,重写一份自己的代码热部署功能。