我有这种情况,我有三个提供相同接口(interface)的声明性服务(比如一个阅读器接口(interface),我有 readerimpl1-database-readerimpl2-flat file-readerimpl3-memory)。我想要一个只绑定(bind)到数据库实现的消费者。在组件定义中,我们给它一个名字,所以我很确定这个名字在注册表中,所以如果我要添加一个激活方法,我可以使用这个名字从组件上下文中查找。
我想通过绑定(bind)/取消绑定(bind)来尝试它,尽管使用服务名称作为参数。我很确定可以使用组件引用元素中的“目标”参数来执行此操作,但我还没有找到如何使用它。
有没有其他人这样做过?
这类似于使用
@Reference(mapped-name="foo")
最佳答案
Target 只是一个 OSGi filter .您可以使用它按任何服务属性进行过滤。因此,如果您的服务具有名为 backend
的属性带值 file
或 database
,您可以绑定(bind)以下目标:
<scr:reference ... target="(backend=database)"/>
具有数据库后端的服务本身将注册为:
<scr:component ...>
...
<property name="backend" type="String" value="database"/>
</scr:component>
关于Osgi 声明式服务条件绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6850444/