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)
为什么不能绑定到提供者的原因是什么?
我想这是因为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(因为第二个绑定)?
这真的是多余的.因为您可以注入SomeClass或Provider<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)