【问题标题】:which one is called first Activate function or bind function in SCR Runtime哪个在 SCR 运行时被称为第一个激活函数或绑定函数
【发布时间】:2013-04-03 08:49:50
【问题描述】:

我对组件激活时调用激活函数或绑定函数的顺序感到困惑。在我看来,激活函数函数将首先被调用,因为 Bind 函数用于绑定服务。但是我们知道,所有的目标服务都是先进入组件上下文,然后组件才会被激活。

请消除我的疑问。

【问题讨论】:

  • 问题是什么?

标签: osgi equinox apache-felix knopflerfish


【解决方案1】:

activate 方法将在所有静态引用被绑定后调用,即在绑定方法被调用后。所以在activate过程中,可以确定静态引用的值不会改变。

但是对于动态参考,所有的赌注都被取消了。事实上,动态引用的值可以在不同线程中多次更改,激活方法执行期间。

更新:您没有询问停用问题,但您可能会发现此信息同样有用。 deactivate 方法将在 任何静态引用未绑定之前调用。例如:如果您绑定到具有静态引用的服务并且您绑定的服务消失了,那么 SCR 将首先调用您的 deactivate,然后调用您的 unbind 方法,最后它会释放组件实例以用于垃圾回收。

【讨论】:

  • 感谢@Neil Barlett,这里我指的是动态引用。但我怀疑在绑定方法中我正在检查componentcontext 是否为空。组件上下文何时为 null ?我认为当组件未激活时它会为空。
  • 如果您的组件未激活,您将无法获取 ComponentContext,因为它是在您的激活方法中提供给您的。因此,它没有办法为空。但是,您可能甚至根本不需要使用 ComponentContext。我建议不要使用它。
  • 一个问题是如果你使用bind(ServiceReference ref) 签名:它需要ComponentContext 来通过componentContext.getBundleContext().getService(ref) 解析引用。但是如果在 activate() 之前调用了 bind(),您必须暂时记住迄今为止绑定的 ServiceReferences 列表,然后在 activate() 中解决它们。有点烦人:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 2017-12-07
  • 1970-01-01
  • 2023-03-13
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多