gpt4 book ai didi

java - DS 组件的生命周期如何运作?

转载 作者:行者123 更新时间:2023-12-01 12:30:19 27 4
gpt4 key购买 nike

在 bundle 启动和停止时按什么顺序调用带注释的方法?

我使用aQute.bnd.annotation的注释。

有这方面的文档吗?

我的猜测是: bundle 启动时:

  1. 设置A
  2. onStartUp (@Activate)

在捆绑站上:

  1. 取消设置
  2. onShutdown(@Deactivate)

我需要一个在取消设置对组件的所有服务引用后调用的方法。我可以使用 @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;
}

}

最佳答案

生命周期在 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 作为成员变量以保证线程安全。

关于java - DS 组件的生命周期如何运作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25969773/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com