OSGI 基础

OSGI技术详解


1. OSGI概述
OSGI联盟1993年3月成立, OSGI初衷是为智能家居领域制定的基于Java构建模块化、动态化嵌入式系统的规范;
OSGI(Open Service Gateway Intiactive)开放式服务网关交互系统规范,被定义为: The Dynamic Module System For Java;
为了让开发者能够  构建动态化、模块化的 Java系统;
2. 基于OSGI的实现产品
WebSphere(IBM), WebLogic(Oracle), JBoss, Eclipse 
3. Java模块化规范
JSR291 引入OSGi规范到Java系统;JSR232针对 J2ME移动设备的 OSGi规范;


4. OSGI的模块
基于OSGI系统的设计任务:分解整个系统,划分各部分的范围,界定出模块形成Bundle;
Bundle是OSGI的模块,是服务和组件的载体;
Bundle的生命周期由OSGI框架所管理;
Bundle的状态: Installed, Resolved, Uninstalled, Starting, Active, Stopping;
Bundle可以被动态的安装、启动、停止、卸载;



基于OSGI的系统,由于Bundle的动态加载和部署能力,使得整个系统更易于扩展和服务的管理;是模块化开发、部署的极佳选择;


5. OSGI的服务
服务:是指注册到OSGI框架的java对象;Bundle通过 BundleContext 上下文注册和获取服务;
Declarative Service(DS)


6. OSGI的层次划分
1). Module Layer
主要定义了Module如何去组织、如何去部署;
2). LifeCycle Layer
生命周期层,定义了Bundle的生命周期,并对其进行管理;
3). Service Layer
定义了Bundle动态协作的服务发布、查找和绑定模型;


7. OSGI类加载机制
Bundle的包共享机制: Import-Package, Export-Package 导入导出方式共享;
1).关于 Import-Package 和 Export-Package
直接引用方式,OSGI在解析Bundle时就会检查其依赖项; 如果依赖项不可用时会 resolve失败;
Import-Package: org.osgi.framework;version="1.0"
Export-Package: com.rainteen.osgi.time;exclude="*Impl";include="Time*";
=======================================================================
动态引用方式, OSGI 在使用到动态引用的包时才会尝试去获取;类似于延迟加载的意味;
DynamicImport-Package: org.osgi.framework;
Import-Package: com.rainteen.osgi.time;resolution:=optional;
2).类加载机制
i. JDK的双亲委派机制
BootStrapClassLoader 启动类加载器(jdk/lib)
ExtClassLoader 扩展类加载器(jdk/jre/lib/ext)
AppClassLoader 系统类加载器(classpath及当前目录)
CustomerClassLoader 自定义类加载器
以上四个类加载器,是自底向上检查请求加载的类是否已经被自己加载;自顶向下尝试加载类;
其中的 ExtClassLoader 和 AppClassLoader都是派生自 URLClassLoader, 可以通过 URLClassLoader.getURLs() 获取这两个类加载器加载类的路径;
在JVM中一个类用其全名和一个加载类ClassLoader的实例作为唯一标识,不同类加载器加载的类将被置于不同的命名空间.
JAVA默认的线程上下文类加载器是 AppClassLoader;
使用线程上下文类加载器,可以在执行线程中,抛弃双亲委派加载链模式,使用线程上下文里的类加载器加载类。
ii.OSGI的网状结构
OSGI中,ClassLoader可以通过下面几个区域来加载类和资源:
a). Boot Class Path
Boot Class Path中包含了java.*及其实现的包;
b). Framework Class Path
框架通常会为其实现的类建立一个单独的ClassLoader;
c). Bundle Space
Bundle Space则包含了与这个Bundle有关的所有jar文件;
Bundle的ClassLoader能获取到的类包括:
a).Parent ClassLoader能加载的类
OSGI实现中 Parent ClassLoader通常都是 Boot ClassLoader(根类加载器), 通常是 java.*;
b).当前Bundle的 Import-Package;
c).当前Bundle的 Require-Bundle;
d).Bundle自己的Bundle-ClassPath 中的类;


8.OSGI类加载的途径
i).如果必须加载的类是java.*, 委派给 Parent ClassLoader,能加载时加载,不能加载时 NoClassDefFoundException;
ii).如果必须加载的类不是 java.*, 而是属于 boot delegation中配置的范围 则委派给 Parent ClassLoader; 如果不属于则 NoClassDefFoundException;
iii).如果加载的类属于Import-Package 中的类,则交给Export-Package 的bundle类加载器加载;加载成功直接返回,否则 NoClassDefException;
iv).如果属于Require-Bundle 中的类,则交给Export-Package 的bundle类加载器加载;加载成功直接返回,否则 到下一步;
v).在当前Bundle的Bundle-ClassPath 中搜索需要加载的类, 加载成功直接返回,否则到下一步;
vi).如果属于Export-Package 则抛出 NoClassDefException,否则到下一步;
vii).如果属于DynamicImport-Package 中的类, 则交给Export-Package 的bundle类加载器加载;加载成功直接返回,否则 NoClassDefException;
9.监听 Bundle状态
i).通过实现 BundleListener 或 SynchronouloBundleListener 来监听BundleEvent;
ii).通过实现FrameworkListener来监听FrameworkEvent;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值