Osgi 在SCR运行时,哪个函数被称为第一个激活函数或绑定函数

Osgi 在SCR运行时,哪个函数被称为第一个激活函数或绑定函数,osgi,equinox,apache-felix,knopflerfish,Osgi,Equinox,Apache Felix,Knopflerfish,我对组件激活时调用哪个函数激活函数或绑定函数的顺序感到困惑。在我看来,将首先调用activate函数,因为Bind函数用于绑定服务。但正如我们所知,所有的目标服务首先进入组件上下文,然后组件被激活 请澄清我的疑问。在绑定所有静态引用之后,即在调用绑定方法之后,将调用activate方法。因此,在激活过程中,可以确保静态引用的值不会更改 但是,对于动态引用,所有赌注都是无效的。事实上,在activate方法的执行过程中,动态引用的值可能会在不同的线程中多次更改 更新:您没有询问停用问题,但您可能会

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


请澄清我的疑问。

在绑定所有静态引用之后,即在调用绑定方法之后,将调用activate方法。因此,在激活过程中,可以确保静态引用的值不会更改

但是,对于动态引用,所有赌注都是无效的。事实上,在activate方法的执行过程中,动态引用的值可能会在不同的线程中多次更改


更新:您没有询问停用问题,但您可能会发现这些信息仍然有用。在任何静态引用解除绑定之前,将调用deactivate方法。例如:如果您绑定到具有静态引用的服务,并且绑定到的服务消失,那么SCR将首先调用您的deactivate,然后调用您的unbind方法,最后将释放组件实例进行垃圾收集。

问题是什么?谢谢@Neil Barlett,这里我指的是动态引用,但我有一个疑问,就是在bind方法中,我检查componentcontext是否为null。组件上下文何时为空?我认为当组件未激活时它将为null。如果组件未激活,则无法获取ComponentContext,因为它是在激活方法中提供给您的。所以,它不可能是空的。然而,您甚至可能根本不需要使用ComponentContext。我建议不要使用它。一个问题是如果使用
bind(ServiceReference ref)
签名:它需要ComponentContext通过
ComponentContext.getBundleContext().getService(ref)
解析引用。但是如果在activate()之前调用bind(),则必须暂时记住到目前为止绑定的ServiceReferences列表,然后在activate()中解析它们。有点烦人:)