OSGI的初级研究

什么是OSGI?

OSGI,是一种规范,是一种编程得规范,他真正实现了高内聚,低耦合,以前我们可能都在努力得掌握设计模式、希望能够实现高内聚,低耦合,但我们得感觉就是,完成得不够彻底,但是现在OSGI告诉我们,我们可以实现完全得高内聚,低耦合,只要你理解面向接口得编程,你就会发现用起OSGI是如何得方便。在你得代码中,在你得团队中,有人使用你得模块,你只需早早得提供给他接口,他就可以进行开发,不用非要等你开发完成,而且,就算你开发完毕,也不用再进行修改,不需要将实例直接传递给队友得模块,OK,OSGI得框架会帮助你。他有一套很好得体系结构去帮助你管理你得接口实现(这里我们称为组件)。同时,OSGI支持即插即用得思想,你可以完全不用修改任何代码,重新实现一个接口,就可以嵌入到了系统之中,并且你得实现将被在不知不觉中被替换。下面是OSGI应用架构图,非常得形象。

       图1 OSGI系统概述

在OSGI中,任何东西都可以是绑定,一个接口、一个实现类、一个使用者,要想提供或者使用OSGI管理着得服务,都需要称为一个Bundle绑定,而具体得服务,则是由Bundle发布得,也是有Bundle使用得。从这个层面上可以将OSGI得应用抽象出来一个如图1一样得服务、Bundle、OSGI得三层结构。

 

 

 

象图1所示,服务使用者、服务提供者、接口提供者、都是一个个得Bundle,他们是服务使用和发布的实体,接口提供者提供接口,服务提供者提供接口对应得实体服务、这些接口和对应得服务,会被OSGI管理,服务使用者根据接口就可以找到实现得服务,并且使用。具体得使用,可以看下图。

OSGI, 在这里只做简单的介绍,OSGI实际上可以叫做一个服务器,这个服务器绑定了许多的Bundle,一个Bundle是由一个文件夹组成,其中有代码、资源、配置文件,每个bundle有自己的ClassLoader,通过OSGI提供的服务端口,绑定到OSGI框架上,由于每个Bundle自身有ClassLoader,所以一个Bundle的崩溃,不会导致整个系统的崩溃,这就是OSGI的好处之一,另外,一个Bundle可以注册很多的Service,另外一个Bundle想用这个Service的时候,可以通过BundleConext获得,这个BundleContext是整个OSGI的上下文,负责所有的Bundle和Service的管理,也就实现了Bundle之间的通信,避免了信息孤岛。

 

具体得开发步骤

利用OSGI进行系统开发,由OSGI去负责模块间得相互调用,是非常方便得,如果你真正使用了OSGI进行系统开发,就会感受到他得魅力所在。那么就给出一般得基于OSGI得系统开发步骤

一、系统设计,模块化。

这个步骤是最难得,也是后续开发得关键保证,将系统模块化,如果做到好,对于后期得扩展和维护或者重构是非常有好处得。真正目的就是将模块高内聚、低耦合。

二、抽象出接口,将接口作为Bundle。

     面向接口得编程是面向对象编程得本质,只关心接口,而不关心实现,是在系统设计时得关键

三、分工实现接口,将实现构建成Bundle,并且注册具体接口的服务。

     分好接口就可以进行团队开发,分发给各个队员任务,实现接口,系统就大致得构建起来了,基于OSGI得简便性,你得设计在理论上是完全可以立即运行起来的。是要你设计得接口都有对应得实现类,并且注册为OSGI服务。

 

Ok,你会问,难道就不用队员之间进行集成吗? 如果你设计得好,OK,真的不用,即插即用就是OSGI得设计理念,真正实现高内聚,低耦合就是OSGI得目标,很庆幸,他实现了。

 

OSGI简单开发例子

(事实上,如果你去Google搜索“OSGI官网” 上面得例子应该更权威)

如果看过我写得另外一篇基于URLClassLoader得简单插件程序,那么现在我用OSGI,也去开发这样一个插件程序。目的很简单,就是用一个接口,实现不同得功能,

那么就按照上面得开发步骤,我们一步一步来实现。

一、系统设计

在我们这个系统中,系统比较小,也没有什么非常好设计得。大致可以分为三个Bundle,

主程序的Bundle,包括启动程序界面,绘出菜单。一个操作接口得Bundle,就是操作得统一接口(Oper),public void operation();用于操作,然后呢,就是实现啦,就是服务实现得Bundle,实现Oper接口,实现其方法。然后利用BundleContext发布这个服务。

二、构建Plug-in得OSGI工程,添加Oper接口,定义public void operation();方法,并且将所在得包导出。

三、构建主程序,将Oper所在得包导入(要记住,要发布接口给别人去实现或者使用,得导出,你要实现某个接口或者用他得实现服务就得先导入)。在Start(BundleContext c)得方法下启动程序,怎么获得Oper得实例呢

OK,交给c,c是BundleContext得实例,通过他可以获得任意得部署到OSGI上得服务,

ServiceReference ref = c.getServiceReference(Oper.class

.getName());

if (ref == null) {

System.out.println("ref is null");

return;

}

Oper oper = (Oper) context.getService(ref);

 

 

OK,就这么简单,就这样就可以获得Oper得实例了,那么到底是谁实现得呢

四、定义另外一个Bundle工程,实现Oper接口,并且在Start(BundleContext c)中调用注册服务得方法,c.registerService(Oper.class.getName(), null ,null)。OK,以及将实例绑定到了OSGI上,那么你得服务就可以被别人使用了。

 

程序结束了嘛?OK,已经结束了,这就是OSGI的魅力,好好体会吧,呵呵。

  • 浅谈HttpService

HttpService是OSGI上的服务,也可以说是一个插件,装载了org.eclipse.equinox.http的插件(就是一个Bundle)以后,就可以使用这个服务了,还记得怎么获得服务的引用吗? 呵呵 HttpService也是一个接口,他的实例引用的获得也是遵守OSGI的开发模式的,所以你可以这么获得HttpService。

ServiceReference ref = c.getServiceReference(HttpService.class

 

.getName());

if (ref == null) {

System.out.println("ref is null");

return;

}

HttpServiceoper = (HttpService) context.getService(ref);

呵呵,是不是很通俗呢,那么到底这个HttpService有什么用呢,可以最通俗的,他的作用就是为了来做服务器可以做的事,可以控制你去访问资源,访问Servlet,目前也可以支持JSP,SUN已经说了,在下一代的服务器,会重点考虑OSGI,

不说废话,HttpService可以注册资源,可以注册Servlet,所谓的资源,就比如Html网页,JSP脚本等,就调用HttpService的registerResource,如果注册Servlet,就调用其registerServlet,那么启动后用户就可以访问这个Servlet和网页了,这正这个部分详细的可以看OSGI中国官方网。

 

  • OSGI与Web服务集成

OSGI由于他可以集成Servlet,那么他就为他集成web服务成为了可能,这里用Axis作为例子,简单的叙述一下,让HttpService绑定服务管理的两个Servlet一个是AxisServlet和AdminServlet,将其绑定到HttpService,调用其init方法,就完成的初始化(在服务器上,服务器的执行过程也是如此),然后配置出其需要的文件目录格式,并且在配置的wsdd文件中部署服务,定义服务实现的Bean,那么就可以集成Web服务了,这个部分可以参看《OSGI进阶》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值