我正在使用 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/