Guice方法注入错误:“无法为<class>创建绑定。它已在一个或多个子注入器或私有模块上配置”

时间:2017-07-05 20:35:21

标签: java dependency-injection guice

我有以下课程,其中我需要使用Guice进行方法注入。

@Singleton
public class A {

    private final Injector injector;

    @Inject
    public A(Injector injector) {
       this.injector = injector;
    }

    public void method1() {
        ...
        final XInterface x = this.injector.getInstance(Key.get(XInterface.class, Names.named("provideX")));
        ...
    }
}

该模块包含以下提供的方法:

public class MyModule extends AbstractModule {

    @Override void configure() {
        // no binding and scope for class A
    }

    @Provides
    @Named("provideX")
    public XInterface provide(@Named("isTest") boolean isTest, X x, XMock xMock) {
        return isTest ? xMock : x;
    }
}

isTest在同一模块中有一个提供者,在本次讨论中可以忽略。

现在,A类中的这个注入给了我以下错误:

Unable to create binding for `A`. It was already configured on one or more child injectors or private modules. If it was in a PrivateModule, did you forget to expose the binding?

并且堆栈跟踪的其余部分不是很有帮助。

在挖掘了一段时间并尝试了一些事情之后,我发现只需在Singleton中为A类定义MyModule.configure()范围就像这样:bind(A.class).in(Singleton.class);并删除现有的A类的@Singleton注释解决了错误。现在我的问题有两个:

  • 第一次实施时导致错误的原因是什么?
  • 在模块中定义单例范围和用单例范围注释类之间有什么区别?为什么这样可以解决问题?

提前致谢!

0 个答案:

没有答案