头安排的任务最近不是很忙。偶然看到了OSGI的一点介绍。遂搜索之。结果网上一片溢美之词,好奇心起,学习一下。
简言之,osgi强大之处在于:
1、支持“热插拔”。就像硬件一样,这是非常强大的功能。系统可以很方便地扩展新的功能。通过安装新的Bundle、更新或停止现有的Bundle来实现系统功能的插拔。
2、允许系统动态的改变行为。先停用目前的bundle,在启动新的bundle。即轻松的实现了动态的改变行为。
3、代码的复用性。传统的代码组织形式有两种,第一种是一个项目是一个工程,不同的模块以不同的包名区分,这很不利于代码的复用,基本是修改已有的代码;第二种是不同的模块单独建工程,但是你将会深受其代码引入混乱的困扰,可能会交叉引入,部署也会非常麻烦。基于OSGI的系统采用规范的模块开发、部署方式构建系统。当你打算开发一个系统时,你将可以直接使用大量的免费、稳定的功能模块。现有的大量服务: 服务: 日志 、配置管理 、偏好, HTTP(运行 servlet )、 XML分析、 设备访问分析、 设备访问软件包 管理、 许可星级用户管理、 许可星级用户管理、 许可星级用户管理、 许可星级用户IO 连接、 线管理连接、 线管理Jini 和 UPnP 。
4、稳定高效的系统。由于osgi Framework基于微核机制,只要微核不崩溃,系统就不会崩溃。其支持热插拔的特性,则保证了该系统的高效性,只有在请求时才会去加载、启动相应的bundle、service。
使得osgi具有这一强大功能的是SOCM——(Service-Oriented Component Model)——面向服务的组件模型。服务(作为最基本的组织形式和结构单元,)通过互相之间的约定规则进行通讯。
OSGI框架是一个微核结构的容器,所有的模块都需要运行在容器范围内,在OSGI中所有模块的部署都必须以Bundle的方式来进行部署,那么到底什么是Bundle呢?
Bundle其实就是一个jar文件,这个jar文件和普通的jar文件唯一不同的地方就是Meta-inf目录下的MANIFEST.MF文件的内容,关于Bundle的所有信息都在MANIFEST.MF中进行描述,说的时髦点,可以称它为bundle的元数据,这些信息中包含有象Bundle的名称、描述、开发商、classpath、需要导入的包以及输出的包等等,在后续的开发Bundle中将会详细的介绍Bundle的元数据以及如何去开发Bundle。
Bundle是个独立的概念,在OSGI框架中对于每个Bundle采用的是独立的classloader机制,这也就意味着不能采用传统的如引用其他Bundle的工程来实现Bundle间的协作了,那么在OSGI框架中Bundle之间是怎么协作的呢,在OSGI框架中对于每个Bundle可以定义输出的包以及引用的包,这样在Bundle间就可以共享包中的类了,尽管这样也可以直接实现简单的Bundle的协作,但在OSGI框架中更加推荐的是采用Service的方式,Service-Oriented的概念(例如SOA)大家都接触多了,OSGI框架也同样是如此的,每个Bundle可以通过BundleContext注册对外提供的服务,同时也可以通过BundleContext来获得需要引用的服务,采用Service-Oriented的方式可以使得对外提供的服务能够更加的封闭,不需要为了使用别的Bundle提供的Service而做环境依赖等的设置,同时,Bundle还可以采用Require-Bundle的方式来直接引用其他的Bundle(相当于引用其他Bundle的工程或jar)。
Bundle Bundle 之间的交互方式:
1. 通过 Package的 Export(对外暴露自己的一个 或多package) 和 Import( 导入别人的一个或多 个 package) 来进行
2. 通过 Service的方式进行。一个 Bundle 作为 Service 提供 方,对外提供Servcie . 使用者可以 查找到提供的 Service. 并使用这个 ServÎce. 而提供 /使用 Service 又存在两种方式:一是经 典的做法,通过 BundlcContext ( Bundle 的上下文 )来提供和获取 .一种是使用 Declarative Service 来实现 .
具体的详解,将继续边学边总结。
原创文章,转载请注明来源:http://www.cnblogs.com/tanshanping/p/3184204.html