【问题标题】:Osgi Declarative service conditional bindingOsgi 声明式服务条件绑定
【发布时间】:2011-10-14 14:14:32
【问题描述】:

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

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

其他人做过吗?

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

【问题讨论】:

  • 这是一个非常有趣的问题。这让我想到了你是否更喜欢数据库impl但会接受另一个的相关问题。在这种情况下,您可以通过 @Reference(cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE,policy=ReferencePolicy.DYNAMIC) 实现,然后在添加/删除方法中筛选列表。

标签: osgi declarative-services


【解决方案1】:

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

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

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

<scr:component ...>
    ...
    <property name="backend" type="String" value="database"/>
</scr:component>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2012-04-27
    • 2011-11-16
    • 2019-08-05
    • 2013-10-09
    • 2018-05-20
    • 1970-01-01
    相关资源
    最近更新 更多