如果我有一个被其他组件(称为 B)引用的服务 A,那么 B 对 A 的引用何时变为空?
- 在调用 A 的 deactivate 方法之前?
- 调用A的deactivate方法后,完成了吗?
- 对象的实例被销毁后?
我浏览了纲要规范,但找不到有关此的详细信息。如果有人能为我澄清一下,我将不胜感激。
此外,当服务 A 被激活时,它是在什么时候作为对 B 的引用而被注入的?在激活方法之前还是之后?
如果我有一个被其他组件(称为 B)引用的服务 A,那么 B 对 A 的引用何时变为空?
- 在调用 A 的 deactivate 方法之前?
- 调用A的deactivate方法后,完成了吗?
- 对象的实例被销毁后?
我浏览了纲要规范,但找不到有关此的详细信息。如果有人能为我澄清一下,我将不胜感激。
此外,当服务 A 被激活时,它是在什么时候作为对 B 的引用而被注入的?在激活方法之前还是之后?
这个问题有两个答案,具体取决于您是使用静态还是动态策略进行引用。我将首先介绍静态策略。
在激活期间,静态策略保证所有将要被调用的绑定方法在激活方法之前被调用。请注意,如果任何引用是可选的,则绑定可能根本不会被激活。但是 DS 强制执行先发生关系(根据 Java 内存模型 JSR133 的条款),因此 activate 方法可以安全地依赖于静态策略引用的绑定方法期间设置的任何字段的值,而无需显式同步。
使用静态策略,如果任何绑定的服务不可用,则必须停用组件。DS 再次保证在调用任何 unbind 方法之前调用并完成 deactivate 方法。(请注意,很少需要为静态引用实现 unbind 方法......如果您的组件有任何清理工作要做,那么在 deactivate 方法中完成这一切会更容易)。
现在,动态策略使事情变得更加复杂。对于动态+强制引用,仍然可以保证在激活方法开始之前已经调用了绑定方法,但是在那之后所有的赌注都被取消了。实际上,在 activate 方法的执行过程中可能会调用绑定/取消绑定(甚至多次!) 。
还要确保您参考了第 112.5.10 节(“绑定服务替换”),它描述了调用绑定/取消绑定的顺序。一开始它可能不直观——新服务的绑定在旧服务的解除绑定之前被调用——但是当你考虑它时,它是完全有道理的,因为它保证了强制引用永远不会被绑定到 null。
据我所知,您得到的保证是在 deactivate 方法完成后删除引用。