我遇到通过Karaf使用OSGi声明服务时加载订单组件的问题。
我遇到这种情况:
@Component
public class A implements IA
{
doSomething() {...}
}
@Component
public class B implements IB
{}
@Component
public class C implements IC
{
@Reference
IA a
@Reference
(cardinality = ReferenceCardinality.MULTIPLE,
policyOption = ReferencePolicyOption.GREEDY,
unbind = "doUnRegister" )
void doRegister(IB b)
{
a.doSomething()
}
void doUnregister(IB b)
{
...
}
}
A,B和C是三个不同的包。
当启动Karaf时,注册B并调用doRegister。但是:服务A未就绪(a为空)。
我尝试了以下内容:
我必须清楚地遗漏一些东西,是否有人遇到类似的问题并找到了解决方案?
更新 参考A a改为IA a。添加了关于参考B()的遗忘信息。
答案 0 :(得分:0)
根据您提供的示例代码,C
在A
和B
出现之前不会被激活,因为对A
和B
的引用是静态的,强制性参考。所以开始订购是不相关的。
此外,引用按它们在组件描述XML中编写的顺序设置。当Bnd将注释处理到组件描述XML中时,它会按引用名称顺序写出引用。可以显式设置引用名称,并默认为带注释的成员的名称。因此,在您的示例代码中,a
位于doRegister
之前,因此在调用a
之前将设置字段doRegister
。
我的猜测是,在您努力将实际代码减少到此示例时,您已经丢失了一些重要信息来理解您的问题。这将包括您的参考的静态/动态和强制/可选性质以及参考名称。