Osgi 在声明性服务中。停用服务时,何时删除对该服务的引用?

Osgi 在声明性服务中。停用服务时,何时删除对该服务的引用?,osgi,declarative-services,Osgi,Declarative Services,如果我有一个被其他组件(称为B)引用的服务a,B对a的引用在哪一点会变为空 -在调用的停用方法之前 -调用A的deactivate方法后,是否完成 -在对象的实例被销毁之后 我查阅了简编规范,但找不到有关这方面的详细信息。如果有人能为我澄清,我将不胜感激 此外,当服务a被激活时,它何时作为B的参考被注入?在激活方法之前还是之后?据我所知,您得到的保证是在停用方法完成后删除引用。此问题有两个答案,具体取决于您是使用静态策略还是动态策略进行引用。我先谈静态保险 在激活期间,静态策略保证在激活方法之前

如果我有一个被其他组件(称为B)引用的服务a,B对a的引用在哪一点会变为空

-在调用的停用方法之前

-调用A的deactivate方法后,是否完成

-在对象的实例被销毁之后

我查阅了简编规范,但找不到有关这方面的详细信息。如果有人能为我澄清,我将不胜感激


此外,当服务a被激活时,它何时作为B的参考被注入?在激活方法之前还是之后?

据我所知,您得到的保证是在停用方法完成后删除引用。

此问题有两个答案,具体取决于您是使用静态策略还是动态策略进行引用。我先谈静态保险

在激活期间,静态策略保证在激活方法之前调用所有要调用的绑定方法。注意,如果任何引用都是可选的,那么绑定可能根本不会被激活。但是DS强制执行“先发生后发生”关系(根据Java内存模型JSR133),以便activate方法可以安全地依赖静态策略引用的绑定方法期间设置的任何字段的值,而无需显式同步

使用静态策略,如果任何绑定服务变得不可用,则必须停用组件。同样,DS保证在调用任何解除绑定方法之前调用并完成deactivate方法。(注意,很少需要为静态引用实现解除绑定方法……如果您的组件有任何清理工作要做,那么在deactivate方法中更容易完成)

现在,动态策略使事情变得更加复杂。对于动态+强制引用,仍然可以保证在activate方法启动之前调用了bind方法,但是在所有下注都关闭之后。实际上,在activate方法的执行过程中,可以调用bind/unbind(甚至多次!)


还请确保参考第112.5.10节(“绑定服务替换”),该节描述了绑定/取消绑定的调用顺序。一开始它可能是不直观的-在旧服务解除绑定之前调用新服务的绑定-但是当您考虑它时,它是非常有意义的,因为它保证强制引用从不绑定为null。

对于具有静态策略的引用,这是正确的。谢谢Neil。这是非常有用的。只有一个问题需要澄清。似乎您讨论的是正在激活的组件中服务的引用,而不是对正在激活的组件的引用。也就是说,如果B对a有一个动态和可选的引用,B什么时候会获取或释放对a的访问?如果B对a有一个动态/可选的引用,那么B将在a服务发布时“获取”(绑定)到a,在a服务未发布时取消绑定。从B的角度来看,A实际上没有必要成为另一个DS组件,它只是一个OSGi服务。但是,如果将实现为DS组件,则其服务将在激活后发布。