Equinox总结

OSGIOpen Service Gateway Interface),开放性服务网关接口。是一种新的编程规范,它的出现引导我们朝着另外的方向去组织我们的代码。

传统的面向对象的java编程方案,有着经典的代码集合单位:类。本人以为,将同类事物的共性抽象出来,就是类。这种编程方式给程序编写带来了一次新的革命。它引导我们按着:接口-实现类-调用,这样的方式编程。这样带来的好处,毋庸置疑,类的功能单一使得类之间都处于“松耦合”的状态,维护起来很方便,层次结构更清楚使得项目开发和维护都比以前轻松。

随着时间的推移,社会的进步,我们客户的需求越来越复杂,变动性越来越大。每个项目只有提供更多的类,才能达到“单一灵活,层次分明”的目标。这就会产生一个问题:类太多了,而且似乎有点混乱。如果这时候需要加上“动态扩充、修改以及改变”的功能,这就有点困难了。在传统的以包归类的方式下,很容易出现包之间的引用,这样就有可能出现模块的交叉引用,或者说是代码污染。这将导致对整个系统灵活性的牵制,无法很方便地进行模块的动态部署,修改,卸载。

设想,如果软件也可以像硬件一样,实现一种“可拔插”的功能,不会受到其他的功能的影响,也不会影响到其他的功能模块,当然也就实现了软件最大的灵活性。其实这样的例子在我们身边已经有代表了,象赫赫有名的IDE Eclipse 就是OSGI思想的完美体现。

Eclipse本身的东西其实很少,就只是一个内核。其他的功能都是以“插件”的形式“动态装配”到上面去的,每个功能就是一个插件,各个插件之间不会受到彼此的影响。打开Eclipse的安装目录,有一个“plugins”文件夹,打开它会发现,里面是很多的jar文件,没错,这些就是我们用到的每个功能模块的API。具体Eclipse使用的是OSGIEquinox(OSGI R4 RI)实现。从3.0版本开始,eclipse虽然在界面上和功能上没有多大的改进,但是其内核,其模块组织形式,却是已经“脱胎换骨”。正因为如此,使得Eclipse具有了高度的扩展性,模块和功能可以任意添加,修改。Eclipse的优秀表现,也使得EquinoxOSGI的诸多实现中占据着优势。

然而OSGI并没有想象中那般火热,引用“OSGI实战(BuleDavy)”的说法:OSGI的推广之所以比较难的原因就在于OSGI的引入并不象决定项目是采用struts还是webwork那么简单,OSGI带来的是设计思想以及开发方式的改变,这也就一定程度上要求系统设计师以及程序开发人员要接受一种新的开发方式,形象的说我觉得就是要让你从jsp+javabean的方式转为采用MVC框架的方式,自然会有些不适应的感觉,但相信只要接受了,会体现出它的足够优势。由此可见,OSGI,带来的是一种编程习惯,思想和方式的改变。将面向对象的方式转换成“面向服务,面向组件”的方式。

EquinoxOSGi核心实现由三部分组成,包括:

OSGi核心规范的实现(org.eclipse.osgi

该项目是OSGi核心框架标准规范的实现。由于Eclipse3.0版本之前未采用OSGi作为系统内核,所以,为了重用Eclipse3.0以前核心系统的代码,EquinoxOSGi实现在一定程度上显得比较繁冗。用户如果想研究开源的OSGi框架实现的源代码,可以从Oscar(目前为ApacheFelix项目)或Knopflerfish项目着手。ObjectWeb上的Oscar项目最初实现OSGi R2版本框架时,整个核心的源代码不超过40个类文件。现在,Oscar项目转由Apache维护,项目称之为Felix,目前已发布1.0版本。Knopflerfish也是很早实现OSGi的一个开源项目,该项目的网站上提供了很多关于OSGi编程的注意事项。

OSGi框架启动支持(org.eclipse.equinox.launcher

OSGi 框架启动支持对于Eclipse IDE开发环境熟悉的开发用户来说并不算陌生。使用Eclipse以前版本的用户会发现在Eclipse安装目录下有一个startup.jar的文件,该文件是Eclipse开发环境的入口程序封装。Equinox将该Jar文件的实现迁移为一个独立的OSGi Fragment。该Fragment主要是帮助Equinox建立起运行环境,如类加载路径,运行配置参数等等。

Equinox启动可执行程序

Equinox启动可执行程序即为eclipse.exe文件,该执行程序并不是Eclipse以前版本的exe可执行文件,而是由原来的eclipse.exe程序拆分而来,该执行文件的一部分功能拆分为一个共享DLL,放置在OSGi框架启动支持段项目(org.eclipse.equinox.launcher)中,与原来的Eclipse根目录下的startup.jar文件功能合并。

OSGI是一个微核结构的容器,所有的模块都要运行在容器中,每个模块称之为一个Bundle,什么是Bundle?实际上,它就是一个实现了某个功能的jar包。它与其他的jar文件不同的地方在于,它的meta-inf目录下的MENIFEST.MF文件中,描述了该Bundle的所有信息,包括它的版本,开发者,依赖包之类之类的信息,我们称其为“元数据”。可以说,BundleOSGI开发的基本单位。接下来将具体介绍一下Bundle

 

 

Bundle通过实现BundleActivator接口去控制其生命周期,在Activator中编写Bundle启动、停止时所需要进行的工作,同时也可以在Activator中发布或者监听框架的事件状态信息,以根据框架的运行状态做出相应的调整,但同时要注意,如果应用是被类似才用Ctrl+C等方式强行终止的话,那么Activator中的stop方法是不会被调用的。

Bundle是个独立的概念,在OSGI框架中对于每个Bundle采用的是独立的classloader机制,这也就意味着不能采用传统的如引用其他Bundle的工程来实现Bundle间的协作了,那么在OSGI框架中Bundle之间是怎么协作的呢,在OSGI框架中对于每个Bundle可以定义输出的包以及引用的包,这样在Bundle间就可以共享包中的类了,这样可以实现简单的Bundle间的合作。不过编写service的方式更加被推荐,通过BundleContxt对象注册对外的服务,同样也可以通过它来获取需要引用的服务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值