OSGi 和 Declarative Services

就像笔者在 怎样创建GWT+OSGi项目 这篇文章中所提到的,在Java世界, OSGi作为一个模块化系统和服务平台一直深受大家的喜爱, 而且随着Eclipse的成功和广受好评, OSGi应用越来越广泛, 小到一个Eclipse插件开发, 大到庞大的J2EE系统。

每一个OSGi的模块对应一个相对独立的解耦合的逻辑块,作为后台(back-end)体系中的OSGi模块,每一个模块常常都要提供至少一个服务,同时使用其他模块提供的服务。如果开发人员自行编写程序来处理模块为彼此提供和使用服务的关系,会十分复杂并且容易出错。在大型的项目开发和运行中,这样自行编写的程序常常会导致在OSGi模块生命周期中过早地实例化或者说启动了一些类或者服务,从而不必要地消耗系统内存和延缓项目运行的速度。

而通过使用Declarative Service,每一个模块显式地声明一些component,用来提供以及使用服务。Component以XML的格式定义,OSGi在runtime创建component的实例。每个模块可以有多个这样的xml文件,每个xml可以包含多个component声明。

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="com.csdn.services.csdn.csdnService">
   <implementation class="com.csdn.services.csdn.DefaultImplementationClass"/>
   <reference bind="setCsdnService" cardinality="1..1" interface="com.csdn.core.model.csdn.CSDNService" name="CSDNService" policy="static" unbind="unsetCsdnService"/>
</scr:component>

这个xml第三行(implementation标签)的作用是告诉OSGi的Servie Component Runtime (SCR),我这个模块中有一个DefaultImplementationClass,将要使用其他模块的服务。第四行(reference标签)的作用是为这个模块声明了对com.csdn.core.model.csdn.CSDNService服务的引用,并且向SCR宣布在DefaultImplementationClass中将使用setCsdnService和unsetCsdnService来set和unset这个服务。(为了线程安全,这个set和unset方法一般定义为public synchronized)

这些XML都需要加入到manifest文件中:

<待续>



你可能感兴趣的:(xml,eclipse插件,osgi,interface,reference,encoding)