1

我目前正在从“标准 OSGi”移植一个非常好的使用 OSGi 和 Vaadin 的模块化 Web 界面演示,以使用 Spring DM。

列出了一个 OSGi 配置文件:

<reference name="PersonListener"
        interface="com.siemens.ct.pm.model.IPersonListener"
        bind="addPersonListener"
        unbind="removePersonListener"
        cardinality="0..n"
        policy="dynamic"/>

我意识到在 Spring DM 中必须使用侦听器来完成,因此以下 bean 配置:

<osgi:list id="personListeners" interface="be.nnuytten.pm.model.IPersonListener" cardinality="0..N">
        <osgi:listener ref="personManager" bind-method="addPersonListener" unbind-method="removePersonListener" />
</osgi:list>

在参考文档中,我发现addPersonListenerremovePersonListener方法需要以下签名:

public void anyMethodName(ServiceReference ref);

说了这么多,但现在问题来了:我如何使用这个 ServiceReference 对象?更具体地说,如何使用 ServiceReference 实现以下目标?

public synchronized void addPersonListener(IPersonListener personListener) {
        logger.info("add personListener: " + personListener);
        personListeners.add(personListener);
    }

现在必须通过以下方式实现相同的功能

public void addPersonListener(ServiceReference ref){}

一如既往地感谢您的帮助!

4

1 回答 1

0

万一这还没有解决。

我对 Virgo(基于 Spring DM)做了类似的事情。您不必使用 ServiceReference。这完全取决于方法签名:

<osgi:list id="xyzzyList" interface="Xyzzy"
    cardinality="0..N">
    <osgi:listener ref="xyzzyRegistry" bind-method="onBind" unbind-method="onUnbind" />
</osgi:list>

Xyzzy 实现中的 onBind() 方法

public void onBind(Xyzzy xyzzy, Map<?, ?> properties) {
    register(xyzzy);
}

问题当然是,您如何处理地图。我什么都没做,真的。

于 2011-04-01T10:55:42.980 回答