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函数的主流程为:

其中在上面第四步调用Frameworkinit方法,初始化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

安装好后会显示bundleID号

然后使用start命令启动bundle

此时会执行代码相应部分,输出信息。

当上面的 bundle 被安装启动之后,框架中所有的服务注册、注销、更改事件都会被此 bundle 检测到,并且会打印出相应的事件信息

注销该bundle

然后卸载掉该bundle

 

 

posted @ 2019-06-30 01:59  库妍  阅读(839)  评论(1编辑  收藏  举报