gpt4 book ai didi

java - 如何使用 Guice 控制对象的生命周期

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:01:16 25 4
gpt4 key购买 nike

我有 Guice 注入(inject)的对象,它有两个生命周期方法 bind()unbind()bind() 方法在 Guice 使用以下注释方法实例化对象后自动调用:

@Inject
final void autoBind() {
bind();
}

我想做的是在 Guice 创建对象的新实例之前调用旧(当前)对象上的方法 unbind()。我该怎么做?

提前致谢!

最佳答案

首先,我不建议您只使用@Inject 注释任意方法。将其保留给构造函数,偶尔用于可选注入(inject)和/或字段注入(inject)。

您尝试做的事情听起来有点奇怪,我不确定这是否正是您想要的。您能否提供更多关于您正在尝试做的事情的背景,因为也许不同的方法更好。这里肯定存在一些关于线程安全以及如何管理引用的问题。

根据您的描述,@meverett 提到的方法可能会奏效。如果您拥有的对象是 Foo,它看起来像这样。

// Later on be sure to bind(Foo.class).toProvider(FooProvider.class);
final class FooProvider implements Provider<Foo> {
private final Provider<Foo> unboundFooProvider;

private Foo currentInstance;

@Inject FooProvider(@Unbound Provider<Foo> unboundFooProvider) {
this.unboundFooProvider = unboundFooProvider;
}

@Override public Foo get() {
if (currentInstance != null) {
currentInstance.unbind();
}
currentInstance = unboundFooProvider.get();
currentInstance.bind();
return currentInstance;
}
}

请注意,您的@Unbound Foo 提供程序将在不调用任何特殊方法的情况下生成Foo。常规的 FooProvider 跟踪状态并决定何时 bind()unbind() 实例。请注意如何管理多个实例并将它们与多个线程一起使用。

此外,需要说明的是:我正在使用 @Unbound,因为您要调用的方法称为 bind()unbind()。我没有使用 Guice 意义上的“绑定(bind)”。

另请注意...在我的脑海中,我非常确定提供者被视为单例,因此像这样维护状态是可行的。如果没有,您显然可以使用某种单例工厂创建一个间接级别(但这不是必需的)。

关于java - 如何使用 Guice 控制对象的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6466051/

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