在bundle start和stop上调用带注释的方法的顺序是什么?
我使用了aQute.bnd.annotation的注释。
有没有关于此的文件?
我的猜测是: 在捆绑开始:
关于捆绑停止:
我需要一个方法,在未设置对组件的所有服务引用之后调用该方法。我可以使用@Deactivate方法吗?
@Component(immediate=true)
public class AImpl implements A {
@Activate
public void onStartUp() {
}
@Deactivate
public void onShutDown() {
}
}
public class B {
private A a;
@Reference(name = "a",
service = A.class,
optional = false,
multiple = false,
dynamic = true,
unbind = "unsetA")
public void setA(A a) {
this.a = a;
}
public void unsetA(A a) {
this.a = null;
}
}
答案 0 :(得分:1)
生命周期在"声明服务" OSGi纲要规范的一章。虽然您使用注释,但会生成XML并且DS基于XML工作。
如果组件停止,则在取消设置引用之前调用@Deactivate方法。您使用动态引用,因此可能会在停止组件之前取消设置引用。
根据您的示例,您可以通过以下方式实现目标:
public class B {
private boolean started;
private AtomicReference<A> a = new AtomicReference<A>();
@Reference(name = "a",
service = A.class,
optional = false,
multiple = false,
dynamic = true,
unbind = "unsetA")
public void setA(A a) {
this.a.set(a) = a;
}
public void unsetA(A a) {
this.a.set(null);
if (!started) {
componentIsStoppedAndReferencesAreUnset();
}
}
@Activate
public void activate() {
started = true;
}
@Deactivate
public void deactivate() {
started = false;
if (this.a.get() == null) {
componentIsStoppedAndReferencesAreUnset();
}
}
public void componentIsStoppedAndReferencesAreUnset() {
// Implement your logic here
}
}
如果您有更多引用,则应在所有未设置方法和停用方法中检查所有引用是否为null。如果您也有静态引用,则可以跳过deactivate方法中的检查,因为它可以确保在deactivate方法之后将取消设置静态引用。
请注意,如果您使用动态参考,则应使用AtomicReference作为线程安全的成员变量。