8

我有这种情况,我有三个提供相同接口的声明性服务(比如一个阅读器接口,我有 readerimpl1-database-readerimpl2-flat file-readerimpl3-memory)。我想要一个只绑定到数据库实现的消费者。在组件定义中,我们给它一个名字,所以我很确定这个名字在注册表中,所以如果我要添加一个激活方法,我可以使用这个名字从组件上下文中查找。

我想通过绑定/取消绑定来尝试它,尽管使用服务名称作为参数。我很确定可以使用组件引用元素中的“目标”参数来执行此操作,但我还没有找到如何使用它。

有没有其他人这样做过?

这类似于使用 @Reference(mapped-name="foo")

4

1 回答 1

15

Target 只是一个 OSGi过滤器。您可以使用它按任何服务属性进行过滤。因此,如果您的服务具有以backendvaluesfile或命名的属性database,您可以绑定以下目标:

<scr:reference ... target="(backend=database)"/>

具有数据库后端的服务本身将注册为:

<scr:component ...>
    ...
    <property name="backend" type="String" value="database"/>
</scr:component>
于 2011-07-28T03:57:30.827 回答