我对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();
}
答案 0 :(得分:1)
我一直将requireBinding()作为模块的合同。
您是正确的,当您调用#get()
或试图注入依赖于绑定的对象时,图形最终将失败。但是,我相信当创建Injector时与创建对象时(通过注射器),requireBinding会导致失败。当我在Google时,它的功能更多是作为合同,而不是具有必然后果的东西。