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

san*_*zky 2 osgi declarative-services

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

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

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

- 对象的实例被销毁后?

我完成了纲要规范,但我找不到有关此内容的详细信息.如果有人能为我澄清,我将感激不尽.

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

Nei*_*ett 6

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

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

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

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

另请确保参考112.5.10节("绑定服务替换"),该节描述了调用绑定/取消绑定的顺序.一开始它可能不直观 - 新服务的绑定在旧服务解除绑定之前被调用- 但是当你想到它时它是完全合理的,因为它保证了强制引用永远不会被绑定为null.