JarsLink 为每个模块创建一个新的 URLClassLoader 来加载模块,并且为每个模块创建一个单独的 IOC 容器来存放本模块的BEAN。支持突破双亲委派,申明了 overridePackages 的包将由子类加载进行加载。
卸载模块需要满足三个条件
所以需要做到三点卸载实例,卸载类和卸载类加载器,整个模块的卸载顺序如下:
模块化开发需要解决隔离性问题,否则各模块之间会互相影响。
模块之间的隔离有三个层次,类隔离,实例隔离和资源(CPU 和内存)隔离。目前 JarsLink 实现了类隔离和实例隔离,通过为每个模块创建一个类加载器来实现类隔离,通过为模块模块创建一个新的 IOC 容器来实现实例隔离。资源隔离准备引入 JVM 多租户来解决。
模块之间的通讯也有三种方式,RPC,本地调用,深克隆/反射。
OSGI 类加载机制的关系采用的是网状结构,每个模块通过 Export-Package 来声明我要给别人用哪些类,通过 Import-Package来声明我要用别人的哪些类。而JarsLink采用的是扁平化管理,每个模块都有一个共同的父类,这个父类加载器就是加载 ModuleLoader 类的加载器。
JarsLink 框架的类图如下: