摘录自InfoQ电子书:《OSGi原理与最佳实践(精选版).pdf》
支持模块化的动态部署
基于 OSGi 而构建的系统可以以模块化的方式(例如 jar 文件等)动态地部署至框架中,从而增加、扩展或改变系统的功能。 要以模块化的方式部署到 OSGi 中,必须遵循 OSGi 的规范要求,那就是将工程创建为符合规范的 Bundle
支持模块化的封装和交互
OSGi 支持模块化的部署,因此可以将系统按照模块或其他方式划分为不同的 Java 工程,这和以往做 Java 系统时逻辑上的模块化是有很大不同的,这样做就使得模块从物理级别上隔离了,也就不可能从这个模块直接调用另外模块的接口或类了。根据 OSGi
基于 OSGi 的 Event 服务也是实现模块交互的一种可选方法,模块对外发布事件,订阅了此事件的模块就会相应地接收到消息,从而做出处理。
支持模块的动态配置
OSGi
支持模块的动态扩展
基于 OSGi
模块化的设计
模块化的设计已经是大家在做系统设计时遵循的基本设计原则,但只有基于 OSGi 来做模块化的时候才会真正体验到何谓模块化,因为 OSGi 中的模块化是物理隔离的,而不基于 OSGi 的话很难做到物理隔离方式的模块化实现,也就很难使系统真正做到模块化,通常切换到基于 OSGi 后就会发现以前的模块化设计做得还是很不足。
基于 OSGi 进行模块化设计和传统的模块设计并没有多大的差别,均为定义模块的范围、模块对外提供的服务和所依赖的服务,相信大家在这点上很容易适应,在 OSGi 中只是更为规范,更为遵循面向服务的设计思想。
在 OSGi 中模块由一个或多个 Bundle 构成,模块之间的交互通过 Import-Package、Export-Package及 OSGi Service的方式实现。
面向服务的组件模型的设计
面向服务的组件模型(Service-Oriented Component Model)的设计思想是 OSGi 的核心设计思想, OSGi 推崇系统采用 Bundle 的方式来划分, Bundle 由多个 Component (组件) 来实现, Component通过对外提供服务接口和引用其他 Bundle 的服务接口来实现 Component 间的交互。
从这个核心的设计思想上可以看出,基于 OSGi
动态化的设计
动态化的设计是指系统中所有的模块均须支持动态的插拔和修改, 系统的模块要遵循对具体实现的零依赖和配置的统一维护(基于 Configuration Admin 服务) ,在设计时要记住的是所依赖的 OSGi服务或 Bundle 都是有可能动态卸载或安装的。对于模块的动态插拔和修改,OSGi
为保持系统的动态性,在设计时要遵循的原则是不要静态化地依赖任何服务,避免服务不可用时
造成系统的崩溃,从而保证系统的“即插即用,即删即无” 。
可扩展的设计
OSGi
引用服务的方式,通过在组件中允许引用服务接口的多个实现来实现组件功能的不断扩展,例如 A 组件的作用为显示菜单,它通过引用菜单服务接口来获取系统中所有的菜单服务,此时系统中有两个实现此服务的组件,分别为文件菜单组件和编辑菜单组件,那么 A 组件相应地就会显示出文件菜单和编辑菜单,而当从系统中删除编辑菜单的组件时,A 组件显示的菜单就只剩文件菜单了,若此时再部署一个实现菜单服务接口的视图菜单组件模块到系统中,那么显示出来的菜单则会为文件、视图。
定义扩展点的方式,按照 Eclipse