requireBinding的用途是什么?

时间:2019-07-02 06:36:37

标签: dependency-injection guice

我对Guice较陌生,试图了解requireBinding的用法以及何时/为什么使用它。

据我了解,Guice在创建注入器时会遍历所有模块的configure()方法的代码,并建立一个依赖图。

如果Guice自己构建依赖关系图,那么为什么模块需要添加requireBinding?只要我能理解requireBinding的用法就是在一个类上添加一个显式依赖项,而guice的依赖关系图似乎仍然在做该类。

我想了解一下,什么时候应该使用requireBinding以及在模块中不使用它会有什么影响。

我已经阅读了Guice的官方文档,并在Stackoverflow /任何其他博客上搜索了所有现有问题,但找不到上述问题的令人满意的答案。

添加到原始问题。

查看AbstractModule的源代码,实现看起来像

protected void requireBinding(Key<?> key) {
    this.binder().getProvider(key);
}

protected void requireBinding(Class<?> type) {
    this.binder().getProvider(type);
}

您会假设这不会带来任何副作用,因为这是“获取”调用。 但是另一方面,查找绑定器本身会向 ProviderLookup

类型的元素列表中添加一些元素
public <T> Provider<T> getProvider(Dependency<T> dependency) {
        ProviderLookup<T> element = new ProviderLookup(this.getElementSource(), dependency);
        this.elements.add(element);
        return element.getProvider();
    }

1 个答案:

答案 0 :(得分:1)

我一直将requireBinding()作为模块的合同。

您是正确的,当您调用#get()或试图注入依赖于绑定的对象时,图形最终将失败。但是,我相信当创建Injector时与创建对象时(通过注射器),requireBinding会导致失败。当我在Google时,它的功能更多是作为合同,而不是具有必然后果的东西。