我正在创建一个包含大量捆绑包的应用程序。其中一些是接口,一些是这些接口的实现。我使用声明式服务 (DS) 来提供和使用服务,这意味着每个包都有一个 component.xml 描述我正在提供/引用的服务。
目前我有一个ClockWidget
实现 3 个接口的类(如您在附图中所见)。对于实现的每个服务,我都有一个引用该服务的特定类。例如,Timeout
该类具有接收任何实现该TimeoutListener
服务的人的绑定方法。
问题是ClockWidget
类的构造函数被调用了 3 次。显然,我将其与其他捆绑包使用的服务数量相关联。
问题是:为了处理实现多个服务的捆绑包,有什么好的方法/实践?我的意思是,我不希望这个捆绑包在应用程序中重复。我想在引用这个人的三个类中使用相同的实例。我尝试在清单中启用单例属性,但没有任何改变。
ClockWidget.class
:
public class ClockWidget implements Widget, TimeoutListener, DummyInterface {
public ClockWidget() {
System.out.println("ClockWidget constructor.");
}
@Override
public String getWidgetName() {
return "Clock widget";
}
@Override
public void onTimeout() {
System.out.println("Timeout!");
}
@Override
public void dummyMethod() {
// Does nothing.
}
}
其组件定义ClockWidget.xml
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="test.e4.ClockWidget">
<implementation class="test.e4.history.ClockWidget"/>
<service>
<provide interface="test.e4.widget.Widget"/>
<provide interface="test.e4.timeoutlistener.TimeoutListener"/>
<provide interface="test.e4.dummyinterface.DummyInterface"/>
</service>
</scr:component>
使用由 提供的服务的类ClockWidget
。在这种情况下,Timeout
类:
public class Timeout {
private ArrayList<TimeoutListener> listeners;
public Timeout() {
listeners = new ArrayList<>();
startTimeoutTimer();
}
public void startTimeoutTimer() {
long timeoutInMs = 60 * 1000;
Timer timeoutTimer = new Timer();
timeoutTimer.schedule(new TimerTask() {
@Override
public void run() {
timeout();
}
}, timeoutInMs);
}
// Bind method from DS
public void addListener(TimeoutListener listener) {
listeners.add(listener);
}
// Unbind method from DS
public void removeListener(TimeoutListener listener) {
listeners.remove(listener);
}
public void timeout() {
for (TimeoutListener listener : listeners) {
listener.onTimeout();
}
}
}
超时组件说明:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="test.e4.Timeout">
<implementation class="test.e4.Timeout"/>
<reference bind="addListener" cardinality="0..n" interface="test.e4.timeoutlistener.TimeoutListener" name="TimeoutListener" policy="dynamic" unbind="removeListener"/>
</scr:component>
有什么建议吗?