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

标签 java dependency-injection guice guice-servlet

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

相关文章:

java - GSON 自动将 JSON 数组解包为 Java 对象

Symfony2 DI服务容器优先级/流

asp.net-mvc-3 - MVC3 Code First/存储库的困惑

java - CDI 的实例或 Guice 提供者的 Spring 等效项是什么

java - 使用注释的 Guice 方法注入(inject)

java - 如何在 Android 中更新来自 Firebase 的电子邮件?

java - 在 Spring 中使用 Twitter4J 获取推文

java - java中如何拆分字符串

java - 使用泛型类进行 Scala 依赖注入(inject)

java - gwt guice 注入(inject)远程 servlet。未找到错误404