gpt4 book ai didi

java - guice - 提供者始终返回相同的实例

转载 作者:太空宇宙 更新时间:2023-11-04 07:49:22 25 4
gpt4 key购买 nike

我正在使用 guice 3 和 guice-servlet 3。在模块中我定义了这种绑定(bind):

[...]
bind(View.class).annotatedWith(Names.named("view1")).to(View1Impl.class);
bind(View.class).annotatedWith(Names.named("view2")).to(View2Impl.class);
[...]

在注入(inject)的类 View1Impl 中,我定义了以下内容:

public class View1Impl {

@Inject @Named("view1") Provider<View> viewProvider;

@Inject
void init() {
View viewA = viewProvider.get();
View viewB = viewProvider.get();

log.debug(viewA == viewB);
log.debug(viewA == this);
}

}

两个语句都返回 true。但事实不应该如此。

我做错了什么?

最佳答案

您可能已经检查过这一点 - 您已经列出了您使用的“某种”绑定(bind) - 但值得仔细检查一下,在您的非编辑代码中,所涉及的类都没有用 @Singleton 谨慎注释或绑定(bind)到 Singleton.class 范围。此外,请确保您的任何绑定(bind)都没有使用 toInstance(),这当然在所有情况下都会返回该预构造的实例,并且实际上是单例绑定(bind)。

我们有一个例子,我们重构了一个 bindView 方法,最终忘记了我们将它设置为始终将其参数绑定(bind)为单例(这样 View 的父容器和 View 的 Controller 可以注入(inject)相同的 View )。

除此之外,正如丹耶尔提到的那样,还有 circular dependency detection编码到 Guice 中,并且由于您在 @Inject 注释的方法中调用 provider.get(),因此您可能正在调用它。

关于java - guice - 提供者始终返回相同的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14748442/

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