一个服务接口的多个实现的选择
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"/>
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"/>
相关文章推荐
- LCS 最大子段和,最大子段和在原数组的首末地址
- 【ecos】service
- hdu 3338 网络流填数字
- Java双缓冲技术
- apache tomcat集群
- 排列、组合相关知识
- 线段树(二)区间更新
- 静态代码块,构造代码块和构造函数的区别
- 中文分词与停用词的作用
- Java开发web的几种开发模式
- Retrofit 介绍
- apache tomcat集群
- QT调用CHM方法
- shared_ptr/unique_ptr一点体会
- #笔记#圣思园 JavaWeb 第2讲——CSS层叠样式表Cascading Style Sheets
- find 常用命令
- python测试框架总结
- 插件启动顺序控制
- 卫星式菜单
- hyundai-wia