我对声明式 OSGi 服务有疑问。我有以下界面:
public interface PrintService {
public void print();
}
及其实现:
public class PrintServiceImpl implements PrintService {
@Override
public void print() {
System.out.println("Hello from PrintServiceImpl!");
}
}
OSGI-INF/component.xml :
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="service">
<implementation class="service.PrintServiceImpl"/>
<service>
<provide interface="print.PrintService"/>
</service>
</scr:component>
list .MF:
Service-Component: OSGI-INF/component.xml
在我安装并启动该服务后,没有任何反应。如何激活它并向控制台打印“Hello from PrintServiceImpl!”。
最佳答案
您应该明确表示您希望服务在 bundle 启动时启动。否则,它会延迟实例化,如果没有其他服务需要 PrintService,它根本不会被实例化。
您可以使用属性 enabled
和 immediate
来控制您的服务生命周期(关于 bundle 生命周期)。 enabled
是微不足道的:指示当 bundle 启动时您的服务是否已启用。 immediate
指示此服务是否是惰性的。 immediate="true"
将立即启动您的服务,immediate="false"
将应用惰性实例化(即等到其他服务请求此服务服务作为依赖)
例如
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="PrintService"
activate="activate"
deactivate="deactivate"
modified="modified"
enabled="true"
immediate="true">
正如 Chris 提到的,如果你希望你的服务在激活时做一些事情,你应该在 activate
生命周期方法中添加一些代码(注意方法的名称可以在组件中指定描述符就像上面明确完成的那样)
protected final void activate() {
print();
}
关于java - 声明式 OSGi 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11009790/