【问题标题】:How to construct an OSGi service with dependencies and publish via DS如何构建具有依赖关系的 OSGi 服务并通过 DS 发布
【发布时间】:2010-07-05 18:03:12
【问题描述】:

我的示例类:

public class MyModel implements Model
{
    :
    :
}

public class SingleModelProvider implements ModelProvider
{
    public SingleModelProvider(Model providedModel, List actions)
    {
          :
    }
}

计划是在几个包中重用 SingleModelProvider 类,以提供 ModelProvider 的不同实现。我需要在每个包中完成的是简单地使用构造函数的适当参数实例化 SingleModelProvider。使用任何 DI 框架的非常简单的场景。如果可能,我想使用 DS(声明式服务)注册 ModelProvider 服务,而不必在 Activator 中编写样板代码。

这可能吗?

我似乎找不到任何有关如何完成此操作的文档,因为 DS 中的类声明似乎不允许构造函数参数(或相关的设置器)。

我使用工厂吗?我不确定这是否值得,因为它可能比手动使用激活器和发布服务更简单。

【问题讨论】:

    标签: java osgi declarative-services


    【解决方案1】:

    DS 确实支持二传手。这是基于您问题中的示例的 DS xml 示例。

    <?xml version="1.0" encoding="UTF-8"?>
    <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" name="SampleModelProvider">
       <implementation class="test.SampleModelProvider"/>
       <reference bind="setModel" cardinality="1..1" interface="test.Model" name="Model" policy="static" unbind="unsetModel"/>
       <reference bind="setList" cardinality="1..1" interface="test.ActionList" name="ActionList" policy="static" unbind="unsetList"/>
       <service>
          <provide interface="test.ModelProvider"/>
       </service>
    </scr:component>
    

    使用构造函数参数在某种程度上违背了 OSGi 的动态特性。服务和捆绑包可以随时启动和停止。 OSGi 友好的代码需要理解这一点,并有对称的方法来处理依赖项的设置和取消设置。

    给您一个问题:在您的系统中,谁负责创建您希望每个提供者接收的模型对象和操作列表?它们可以作为 OSGi 服务使用吗?我提供的示例 DS 假定它们是 OSGi 服务。

    【讨论】:

      【解决方案2】:

      您想使用 DS 是否有特定原因?

      您还可以使用OSGI Service Compendium version 4.2, 121 中所述的 OSGI 蓝图服务。它提供了两全其美:DI 和简单的服务发布/消费。

      据我所知,在 DS 中唯一的选择是使用工厂,绑定/取消绑定方法不接受用户类。 (如OSGI Service Compendium version 4.2,112.4.5所述)

      【讨论】:

      • 我昨天在问了这个问题后遇到了这个问题,它看起来很有希望。我们使用的是 Spring DM,但停止使用它以支持平台本机支持的东西。这看起来是最好的选择,因为它确实满足了我的所有需求。不知道最新版本的 Eclipse 3.5.x 是否支持这个版本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 2014-11-25
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      相关资源
      最近更新 更多