如何构建具有依赖关系的OSGi服务并通过DS发布

时间:2010-07-05 18:03:12

标签: java osgi declarative-services

我的示例课程:

public class MyModel implements Model
{
    :
    :
}

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

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

这可能吗?

我似乎找不到任何关于如何实现这一目标的文档,因为DS中的类声明似乎不允许构造函数参数(或者那个问题的setter)。

我是否使用工厂?我不确定这是否值得,因为它可能使案例不比手动使用Activator和发布服务简单。

2 个答案:

答案 0 :(得分:3)

DS确实支持setter。以下是基于您问题中的示例的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服务。

答案 1 :(得分:1)

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

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

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

中所述