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

时间:2015-05-04 12:56:08

标签: osgi declarative-services

如果我有一个由其他组件(称为B)引用的服务A,那么B对A的引用是否为空?

- 在调用A的去激活方法之前?

- 调用A的去激活方法后,完成了吗?

- 对象的实例被销毁?

我查看了该纲要,但我找不到有关此内容的详细信息。如果有人能为我澄清,我将感激不尽。

此外,当服务A被注入时作为B的参考被激活?在激活方法之前或之后?

2 个答案:

答案 0 :(得分:6)

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

在激活期间,静态策略保证在activate方法之前调用将要调用的所有绑定方法。请注意,如果任何引用是可选的,则可能根本不会激活绑定。但是DS强制执行发生在之前的关系(在Java内存模型JSR133中),以便activate方法可以安全地依赖静态策略引用的bind方法中设置的任何字段的值,没有明确的同步。

使用静态策略时,如果任何绑定服务变得不可用,则必须停用该组件。 DS再次保证在调用任何unbind方法之前调用并完成deactivate方法。 (请注意,很少需要为静态引用实现unbind方法...如果你的组件有任何清理工作,那么在deactivate方法中更容易完成所有操作。)

现在,动态政策变得越来越复杂。对于动态+强制引用,仍然保证在激活方法启动之前已经调用了bind方法,但是之后所有的注意都被关闭了。在执行activate方法期间,实际上可以调用bind / unbind(甚至很多次!)

另外请确保参考112.5.10节(“绑定服务替换”),该节描述了调用绑定/取消绑定的顺序。一开始它可能是不直观的 - 新服务的绑定在旧服务的解绑之前被称为 - 但是当你想到它时非常有意义,因为它保证强制引用永远不会绑定到空。

答案 1 :(得分:1)

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