OSGi的编程思想

作者:SunPeng

 

最近学习了OSGi框架的资料,本文对其作一简单整理。

简单地说,OSGi就是一个服务平台(Service Platform),它采用容器的思想来组织组件:

  • 了解其发展过程,发现最初它就是为了合理地组织模块开发应运而生;
  • 随着SOA的兴起,OSGi利用已有的灵活的组件开发优势,新增了服务的概念­­­­­­——组件注册服务,同时引用其他服务。
  • 在其核心的编程思想上,发现它充分利用了基于组件开发的优势;
  • 同时为了扩大这种优势,采用容器来管理、部署组件,达到系统的灵活性、可扩展性等。

 

具体包括以下三方面。

1、  采用容器的架构思想 

利用容器来组织业务组件、对象,管理和协调组件之间的关系,这是很多框架的核心思想。容器是框架的核心,它提供了组件植入的规范机制,让组件具有生命,提供给组件呼吸的空气。OSGi容器,实现了OSGi Framework 规范的要求,它是OSGi项目的核心部分。一般采用逻辑分层描述其主要实现的功能如下:

L1——模块层:定义了组件的装载(Classloader)机制,管理组件之间的隔离、依赖与协作;它在Java的类装载机制上加入了模块化的概念。

L2——生命周期管理层:负责运行时组件的生命周期,包括动态安装、启动、停止、更新或卸载组件,同时容器提供了运行时管理组件的API

L3——服务注册层:这其实是OSGi结合SOA思想发展起来的,它提供了一个让组件动态注册服务的模型,同时组件可以发现、使用服务。

基于容器机制,便于组件的统一组织和协调;同时让容器提供基础服务,组件只需要关注业务和实现。OSGi容器类似JBossSpring容器一样,提供了运行环境,同时让使用者有机可乘,通过API能扩展、监听容器的执行情况。

 

2、  基于组件的开发思想

OSGi框架的宗旨,就是鼓励基于组件、分模块开发的思想来实现应用项目,同时它也带有约束性地要求以组件的方式来规划、设计、实现项目。当然,OSGi框架还提供了很多基于组件开发的服务,让这些组件在其容器中能有机地结合,良好地运转。主要几方面如下:

(1)、基于OSGi框架开发,模块都必须以组件(Bundle)的方式来组织开发和部署。

(2)、模块可单独形成一个工程,工程之间可没有依赖关系,在运行时,可动态选择需要加载的模块(也即Bundle)。

(3)、模块可动态部署、更新和管理。项目运行期间,可动态卸载模块、更新模块。

(4)、每个模块对应一个Bundle,它采用的是独立的Classloader机制,这也就意味着不能采用传统的如引用其他Bundle的工程来实现Bundle间的协作了。

(5)、每个Bundle可提供BundleActivator去控制自己的生命周期,完成在Bundle启动、停止时所需要进行的工作,同时可发布或者监听整个框架的事件状态信息。

总之,采用OSGi框架,以组件的形式来开发项目,能更好地解决了模块之间的耦合性、消除循环依赖,提高了模块的稳定性,便于以增量的方式来完成项目。

 

3、  组件之间的服务思想

模块或者组件不能是孤立地,孤立地、无人问津的模块将失去其价值。只有模块不断地协调、相互支持才能形成具有实际意义的应用项目。那么,OSGi是如何组织它们的?在OSGi期初,主要是以包依赖的方式来实现,包括输出包到OSGi容器、引用容器里其他组件输出的包、引用容器里的其他组件;之后,OSGi 又推出声明服务(Declarative Services)的方式来更加灵活地组织应用系统,解耦组件之间的依赖关系。

采用声明服务(由Java接口定义)的方式,OSGi主要利用了面向服务(Service-Oriented)的思想,组件可以通过组件上下文注册对外提供的服务,同时也可以通过组件上下文来获得需要引用的其他服务。采用面向服务的方式可以使得对外提供的服务能够更加的封闭,不需要为了使用别的组件提供的服务而做环境依赖等的设置。

其次,在有些OSGi框架(主要指Equinox项目)中,还采用定义扩展点的思想来协调组件的依赖关系,组件里可定义扩展点,其他项目根据需要实现相应的扩展点,相当于模板方法模式里提供的挂钩,只不过在OSGi框架里通过配置来实现,具有更大的灵活性。这样倒置了高层模块和低层模块之间的依赖关系,而且有时候也可消除项目中的循环依赖。

总之,很多框架,学习之余,总能感受到其中些许奥妙的思想,提炼出来,一方面能够更好的分析和学习框架,例一方面如果能将其揉合到开发项目中何尝不是一桩美事。OSGi框架,带来更灵活的基于组件开发技术,也确实带来许多软件开发的新思想。

你可能感兴趣的:(OSGi的编程思想)