org.apache.felix.framework-5.6.12源码解析——org.apache.felix.framework文件夹最后的部分
org.apache.felix.framework-5.6.12源码解析
org.apache.felix.framework文件夹最后的部分
由OSGi规范可见OSGi类加载流程图为:
类加载的优先级顺序基本按照如下的原则:父容器classloader(通常是app classloader) –> 其他bundle的classloader –> 当前bundle的classloader –> 动态导入的包所在bundle的classloader。这个原则既可以使相同的类(包名也相同)尽可能只被加载一次,减少虚拟机perm区大小,也正因为如此,不同bundle中的相同的类,委托给同一个classloader加载,才能做到他们的对象和引用可以相互转换。(要知道一个类如果由不同的classloader加载后,其中一个classloader加载的类的对象是不能赋值给另一个classloader加载的类的引用的。
felix的osgi类加载顺序实现代码
在org.apache.felix.framework.BundleWiringImpl.java类的findClassOrResourceByDelegation(String name, Boolean isClass)方法中:
org.apache.felix.main文件夹全部
其中main函数的主流程为:
其中在上面第四步调用Framework的init方法,初始化Framework实例的具体流程为:
Felix使用举例(写在最后)
启动
和 Felix 框架交互的主要方式是使用上面的Apache Felix Gogo Shell
可以使用 felix:lb 查看当前系统安装的所有 bundle 信息,执行效果如下:
我们可以自己安装和卸载一个Bundle,下面展示怎么安装一个Bundle:
安装主要分为两个步骤,第一是安装、第二是运行
下面展示创建一个简单的 bundle,并配置 MANIFEST.MF 文件,然后编译、安装、运行我们打包好的 bundle。
该bundle的实现代码如下:
然后编写manifest.mf文件,这个文件的作用是声明bundle的一些列元信息,包括此bundle的名称,版本,创建者,启动入口,依赖的包,对外暴露的包。
该文件编写如下:
然后编译该类,编译好后,将编译好的类和manifest.mf一起打包为一个jar包,然后在felix框架下安装此bundle。
安装好后会显示bundle的ID号
然后使用start命令启动bundle:
此时会执行代码相应部分,输出信息。
当上面的 bundle 被安装启动之后,框架中所有的服务注册、注销、更改事件都会被此 bundle 检测到,并且会打印出相应的事件信息。
注销该bundle:
然后卸载掉该bundle