前言
OSGi是基于Java语言的动态模块化规范
特点:
- 模块划分、可见性控制更精确
- 模块级热插拔
0x01 基础知识
Bundle:OSGi中的每个模块称为Bundle,与普通java类库区别不大,都通过jar格式封装,内存存储java package和class。一个Bundle可以生命它所依赖的java package(Import-Package),也可以声明它允许导出发布的java package(Export-Package)
依赖关系:Bundle之间的依赖关系从上层模块依赖底层模块->平级模块之间的依赖,只有Export的Package才能由外界访问,其他会隐藏起来。
热插拔:实现程序模块级的热插拔功能,可以只停用、重新安装然后启用程序中的其中一部分
0x02 Bundle类加载器规则
没有固定的委派关系
某个Bunlde A声明了一个它依赖的Bundle B的Package,如果Bundle B声明发布了这个Package,那么对这个Bundle B的Package的类加载动作都会委派给发布它的Bundle B类加载器去完成
只有使用某个Package或Class的使用,Bundle之间才存在委派和依赖关系,其余时间平级
类加载查找规则
- 以java.*开头的类,委派给父类加载器加载
- 否则,委派列表名单内的类,委派给父类加载器加载
- 否则,Import列表中的类,委托给Export这个类的Bundle类加载器去加载
- 否则,查找当前Bundle的Classpath,使用自己的类加载器加载
- 否则,查找是否在自己的Fragment Bundle中,如果是,则委派给Fragment Bundle的类加载器加载
- 否则,查找Dynamic Import列表的Bundle,委派给对应Bundle的类加载器
- 否则,类加载失败