【发布时间】:2013-04-03 08:49:50
【问题描述】:
我对组件激活时调用激活函数或绑定函数的顺序感到困惑。在我看来,激活函数函数将首先被调用,因为 Bind 函数用于绑定服务。但是我们知道,所有的目标服务都是先进入组件上下文,然后组件才会被激活。
请消除我的疑问。
【问题讨论】:
-
问题是什么?
标签: osgi equinox apache-felix knopflerfish
我对组件激活时调用激活函数或绑定函数的顺序感到困惑。在我看来,激活函数函数将首先被调用,因为 Bind 函数用于绑定服务。但是我们知道,所有的目标服务都是先进入组件上下文,然后组件才会被激活。
请消除我的疑问。
【问题讨论】:
标签: osgi equinox apache-felix knopflerfish
activate 方法将在所有静态引用被绑定后调用,即在绑定方法被调用后。所以在activate过程中,可以确定静态引用的值不会改变。
但是对于动态参考,所有的赌注都被取消了。事实上,动态引用的值可以在不同线程中多次更改,在激活方法执行期间。
更新:您没有询问停用问题,但您可能会发现此信息同样有用。 deactivate 方法将在 任何静态引用未绑定之前调用。例如:如果您绑定到具有静态引用的服务并且您绑定的服务消失了,那么 SCR 将首先调用您的 deactivate,然后调用您的 unbind 方法,最后它会释放组件实例以用于垃圾回收。
【讨论】:
bind(ServiceReference ref) 签名:它需要ComponentContext 来通过componentContext.getBundleContext().getService(ref) 解析引用。但是如果在 activate() 之前调用了 bind(),您必须暂时记住迄今为止绑定的 ServiceReferences 列表,然后在 activate() 中解决它们。有点烦人:)