我正在创建一个具有捆绑功能的应用程序。其中一些是接口,一些是这些接口的实现。我正在使用声明性服务(DS)来提供和使用服务,这意味着每个捆绑软件都有一个component.xml来描述我正在提供/引用的服务。
当前,我有一个名为ClockWidget
的类,该类实现3个接口(如您在附图中所见)。对于实现的每个服务,我都有一个引用此服务的特定类。例如,Timeout
类具有绑定方法,该方法接收实现TimeoutListener
服务的任何人。
问题是ClockWidget
类的构造函数被调用了三次。显然,我将其与其他捆绑软件正在使用的服务数量相关联。
问题是:为了处理实现多个服务的捆绑包,什么是好的方法/做法?我的意思是,我不想在应用程序中重复此捆绑包。我想在引用这个家伙的三个类中使用相同的实例。我试图在清单中启用单例属性,但没有任何改变。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>
有什么建议吗?
最佳答案
ClockWidget是否以3个服务名称注册了一个DS组件?或3个DS组件,每个组件以一个服务名称注册。如果是后者,那么是的,ClockWidget将为每个服务实例化一次,因为这是DS所知道的。如果是前者,则ClockWidget仅应实例化一次,因为它是在3个服务名称下可用的单个服务。