我有一个场景,我需要在OSGi应用程序的几个包中公开作为声明式服务的相同对象。更具体地说,有一个类暴露为声明服务(Service1)。有几个服务消费者。我正在使用maven-scr-plugin来生成SCR描述符。服务使用者可以像这样引用服务接口。
@Reference(name = "Service1",bind = "bindService1",
unbind = "unbindService1", policy = ReferencePolicy.STATIC)
ServiceInterface1 service1;
protected void bindService1(ServiceInterface1 service1) {
this.service1 = service1;
}
protected void unbindService1(ServiceInterface1 service1) {
this.service1 = null;
}
此服务提供程序(Service1)是另一个服务(Service2)的服务使用者。所以Service1也会引用Service2。
@Service
@Component(immediate = true, name = "Service1")
public class Service1 implements ServiceInterface1{
@Reference(name = "Service2",bind = "bindService2",
unbind = "unbindService2", policy = ReferencePolicy.STATIC)
ServiceInterface2 service2;
protected void bindService2(ServiceInterface2 service2) {
this.service2 = service2;
}
protected void unbindService2(ServiceInterface2 service2) {
this.service2 = null;
}
}
这就是我的Service2的样子
@Service
@Component(immediate = true, name = "Service2")
public class Service2 implements ServiceInterface2 {
.....
}
我遇到的问题是我可以看到Service1和服务使用者的绑定方法是由OSGi容器调用的,但绑定到服务使用者中的引用service1的对象没有初始化其service2引用。这意味着当我从服务使用者使用service1对象时,我得到一个Null Pointer Exception,因为service1对象中没有service2对象。 绑定到service1的对象与OSGi容器用于绑定引用service2的对象不同。我想要在所有服务使用者中使用相同的对象。这可以解决吗?