我已经编写了一个OSGi包,可以在我的eclipse 4 rcp应用程序中使用它。如果我添加依赖项,在我的激活器中注册这些服务并将其注入我的课程中,该服务的使用工作正常。
在激活器中
IUserService service = new TestUserService();
context.registerService(IUserService.class.getName(), service, null);
在我班上
@Inject
IUserService service;
service.getSth();
我读到通过声明性服务使用bundle应该是更好的方法。所以改变了我的实施。 我在我的包中创建了一个组件定义来提供我的服务:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="usermanagement.test">
<implementation class="usermanagement.test.TestUserService"/>
<service>
<provide interface="usermanagement.IUserService"/>
</service>
</scr:component>
然后我从我的激活器中删除了服务注册并创建了一个服务使用者类:
public class UserServiceConsumer {
private IUserService service;
public synchronized void setQuote(IUserService service) {
this.service = service;
}
public synchronized void unsetQuote(IUserService service) {
if (this.service == service) {
this.service = null;
}
}
}
和另一个组件定义:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="UserServiceConsumer">
<implementation class="services.UserServiceConsumer"/>
<reference bind="setService" cardinality="1..1" interface="usermanagement.IUserService" name="IUserService" policy="static" unbind="unsetService"/>
</scr:component>
经过这些修改后,我的服务注射不再起作用了。问题是每次注入的服务引用都是NULL。
有谁知道为什么?我忘记了什么吗?
非常感谢!
答案 0 :(得分:3)
我找到了解决方案。
在我的服务的清单文件中,我添加了以下行:
Bundle-ActivationPolicy: lazy
之后,我的应用程序中的userServiceConsumer和组件定义是不必要的。
在视图类中,我现在可以执行以下操作:
public class MyPart {
private IUserService uServ;
@Inject
public MyPart(IUserService uServ) {
this.uServ = uServ;
if (uServ != null)
System.out.println("UserService available");
else
System.out.println("UserService == null");
}
通过DI,我的服务被注入到视图的构造函数中。这对我有用!
答案 1 :(得分:2)
我可以建议一些你可以做的调试。
您是否真的在运行时获得了scr实现? SCR(声明性服务的另一个名称)不包含在Equinox核心中,因此您需要包含它。大多数人使用Felix SCR软件包 - 它将非常愉快地放在Equinox之上。
由于声明服务只使用服务,您可以一次更改应用程序的一半,以确定服务消耗或注册是否无效。
您还可以使用Equinox控制台检查您的服务注册。使用“s”标识您的包,然后“捆绑[no]”以查看注册和使用的服务。如果您使用的是Felix SCR,那么还有Equinox控制台扩展,因此您可以使用“scr list”查看捆绑包尝试注册的所有服务(及其状态),以及“scr info”以获取有关特定服务的详细信息。服务。
答案 2 :(得分:2)
我认为声明性服务在您的UI类中不起作用,因为它不会由SCR创建,而是由Eclipse创建。
因此,您可以尝试将用户界面与@Inject
保持一致,只更改提供服务的捆绑包以使用DS。
基本上我甚至不会尝试更改UI方面。 @Inject
符号比声明性服务的开销要小得多。