0

在 OSGi 应用程序中,我有一个类层次结构,如下所示:

public interface IA {
    public void someMethod();
}

public abstract class AbstractA implements IA {
    public void someMethod(SomeObject s) {
        System.out.println(this.getClass());
    }
}

public class ImplAA extends AbstractA {
    //Some other methods
}

public class ImplAB extends AbstractA {
    //Some other methods
}

接口、抽象类和实现在 4 个不同的包中。另一个包包含一个如下所示的类:

public class SomeClass {

    private IA implAAInstance;
    private IA implABInstance;

    protected void bindToAA(IA ia) {
        implAAInstance = ia;
    }

    protected void bindToAB(IA ia) {
        implABInstance = ia;
    }

    protected void sendStuff(SomeObject p, SomeObject q) {
        implAAInstance.someMethod(p);
        implABInstance.someMethod(q);
    }
}

方法bindToAAbindToAB是绑定函数,分别绑定到包含类ImplAA和的包ImplAB。在 XML 组件定义中,如下所示:

<reference bind="bindToAA" cardinality="0..1" interface="path.to.IA" name="ImplAA" policy="dynamic"/>
<reference bind="bindToAB" cardinality="0..1" interface="path.to.IA" name="ImplAB" policy="dynamic"/>

在包含ImplAA和的包中ImplAB,XML 组件定义中有这一基本行:

<implementation class="path.to.ImplAA"/>
<service>
    <provide interface="path.to.IA"/>
</service>

<implementation class="path.to.ImplAB"/>
<service>
    <provide interface="path.to.IA"/>
</service>

现在的问题是,当我运行代码时,ImplAA使用了两次打印。这是什么原因?我怎样才能让它打印正确的实现类?

4

2 回答 2

3

好吧,您绑定到 IA ... 并且有两个 IA 服务(ImplAA 和 ImplAB)。那么,为什么 DS 会为 bindToAA 使用与 bindToAB 不同的服务实例呢?您只声明需要 IA?

两种绑定方法都需要 0 或 1 个 IA 实例,因此这两种服务中的任何一种都符合要求,在这种情况下,最好只采用一个,因为要求者 (SomeClass) 似乎并不关心差异。

不,我脑海中的大问题是,你到底为什么要依赖实例?OSGi 的全部目的是将实例隐藏起来。如果你有依赖需求,那么表达这个,这就是 OSGi 的方式。

不,如果您只想打印服务,请将基数设为 MULTIPLE 并将服务放入列表中。在这种情况下,您表示对所有 IA 服务感兴趣。

于 2013-07-31T11:34:54.283 回答
1

你做错的是没有在你的 xml 文件中指定目标。

解决方案是向您的 AA 类添加一个属性,例如名称类型和值“aaa”,并调整 xml 文件中的绑定引用,如下所示:

<reference bind="bindToAA" target="(type=aaa)" cardinality="0..1" interface="path.to.IA" name="ImplAA" policy="dynamic"/>

对其他服务执行相同操作,这样当您尝试使用相同接口绑定一组服务的特定服务时,它可以使用 LDAP 过滤器使用目标/属性来区分它们。

有关 LDAP 过滤器的更多信息: 有关 LDAP 过滤器的信息

于 2013-07-31T11:53:21.817 回答