为什么Guice会阻止绑定到Provider?

Luc*_* Wa 2 java dependency-injection guice

最近,当我玩Google Guice时,我试图做这样的事情:

@Override
protected void configure() {
    ...
    bind(Provider.class).to(ViewFactory.class);
    ...
}
Run Code Online (Sandbox Code Playgroud)

哪里ViewFactory是:

public class ViewFactory implements Provider<SomeType> {...}
Run Code Online (Sandbox Code Playgroud)

当然,Guice没有让我做那个回归错误:

1) Binding to Provider is not allowed.
{stacktrace}
Run Code Online (Sandbox Code Playgroud)

为什么不能绑定到提供者的原因是什么?

Vla*_*eev 7

我想这是因为Provider界面对Guice非常特殊.事实上,其所有内部机制都是根据提供商实施的.

而且,这可能会产生歧义.如果可以绑定到提供者:

bind(SomeClass.class).to(SomeClassImpl1.class);
bind(new TypeLiteral<Provider<SomeClass>>() {}).to(() -> new SomeClassImpl2());
Run Code Online (Sandbox Code Playgroud)

然后Guice会在这里注入什么?

@Inject
OtherClass(Provider<SomeClass> someClassProvider) { ... }
Run Code Online (Sandbox Code Playgroud)

它应该是一个返回的提供者SomeClassImpl1(因为第一个绑定;记住,直接注射和提供者注射在Guice中是可以互换的)还是应该是返回的提供者SomeClassImpl2(因为第二个绑定)?

这真的是多余的.因为您可以注入SomeClassProvider<SomeClass>不管实际绑定,您可以将类本身绑定到其提供者:

bind(SomeClass.class).toProvider(() -> new SomeClassImpl());

// Either of the following will work
@Inject
OtherClass1(Provider<SomeClass> someClassProvider) { ... }

@Inject
OtherClass2(SomeClass someClass) { ... }
Run Code Online (Sandbox Code Playgroud)