您的位置:首页 > 其它

一个服务接口的多个实现的选择

2015-08-10 14:55 411 查看
OSGI中使用接口来定义服务,所以每个服务理论上都是可以有多个不同的实现。在这种情况下,如果不做任何指定,Felix框架在通过ServiceReference获取服务对象时,会返回其中一个服务实现。具体Felix如何选择多个实现中的一个,算法尚不明确。但是我们程序中不能指望这个不确定的服务实现,所以必须通过某种方法,指定需要的服务实现。具体方法有一下几种:

1.在代码中通过调用context的Collection<ServiceReference<S>> getServiceReferences(Class<S> clazz,String filter)方法获得满足过滤条件的ServiceReference集合,clazz是服务接口类,filter是过滤表达式,如:(jobname=job2),这个例子中jobname是Job服务定义时提供的property的name,job2是value。

2.ipojo可以帮助我们定义服务和注入服务,在大部分情况下,我们都是通过ipojo配置来实现服务provide和require的,所以上面的代码用ipojo配置来实现的方法是。

服务实现的bundle中

Job2Service有成员变量:private String name;

meta.xml:

 <component classname="com.ailk.common.testjob.Job2Service" name="Job2">

  <provides>

   <property name="jobname" field="name" value="job2" />

  </provides>

 </component>

使用服务的bundle中

JobInvoker有成员变量:private Job job2;

meta.xml:

 <component classname="com.ailk.common.quartz.JobInvoker" name="JobInvoker">

  <requires field="job2" filter="(jobname=job2)"/>

 </component>

3.ipojo下还有一种更直接的方式选择服务实现,就是通过from直接指定服务实现的instance.name。

服务实现的meta.xml中,指定instance的name:

<instance component="Job2" name="Job2Instance"/>

使用服务的meta.xml中这样配:

<requires field="job2" from="Job2Instance"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: