6

我正在使用 guice 并看到了一个binder().requireExplicitBindings() 在这里使用的示例。
该示例如下所示:

Injector injector = Guice.createInjector(new SandwichModule(), new AbstractModule() {
    @Override
    protected void configure() {
        binder().requireExplicitBindings();
        bind(GuiceFilter.class);
    }
});

这会导致异常,例如

com.google.inject.ConfigurationException: Guice configuration errors:

1) Explicit bindings are required and ...

是强制使用还是推荐使用?如果只推荐它,我只是想知道为什么要使用它?

4

2 回答 2

4

它既不是强制性的(那么这将是不需要激活的默认设置)也不是必需的。通常,在使用 guice 时,您希望拥有所有“魔法”来帮助您将应用程序粘合在一起。所以默认行为是:不需要显式绑定。但是每隔一段时间,你就会注意到guice automatisms 挡住了你的路。在极少数情况下,您会使用 require 开关。我没有阅读您提供的整篇文章,因此我无法判断他们是否正在处理这些“特殊情况”之一,或者他们是否只是使用标志而没有真正考虑原因。无论如何,如果您编写绑定模块,请忽略它。

于 2013-06-06T15:08:14.120 回答
2

我认为这个开关可能非常有用,可以更快地指出编程错误,在这些错误中你错误地将不应注入的东西注释为可注入的,如下所示:

@Inject
private SomeClass someInstance = new SomeClass(12);

如果 SomeClass 现在也有一个公共的无参数构造函数,Guice 只会覆盖特定的实例而不说什么。

然而,自动注入的用处通常远不止于此,因此对于这个特定示例,您只需要小心不要意外“注入所有内容”:)

于 2013-12-16T11:43:35.683 回答