如果我创建一个提供程序并将其绑定到一个类,就像这样
bind(MyClass.class).toProvider(MyClassProvider.class)
然后
Provider<MyClass>
自动绑定to MyClassProvider
。如果您想将Provider<MyClass>
注入MyClassProvider
中,这是一个问题,如下所示:@Inject
public MyClassProvider(Provider<MyClass> provider)
我想将默认的Guice提供程序注入到我的提供程序中,以便可以在自定义提供程序中轻松创建新实例。怎么做?
最佳答案
您将需要在两个之一上使用binding annotation。如果您不介意为MyClass的用户添加注释,这将非常容易。
public class AccountTest {
@Test
public void test() {
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(MyClass.class).annotatedWith(Names.named("MYPROVIDER")).toProvider(MyClassProvider.class);
}
});
MyClassUser user = injector.getInstance(MyClassUser.class);
assertTrue(user.get().myProvider); // Shows if was created via my provider or the Guice provider.
}
}
class MyClassUser {
Provider<MyClass> provider;
@com.google.inject.Inject
public MyClassUser(@Named("MYPROVIDER") Provider<MyClass> provider) {
this.provider= provider;
}
MyClass get() {
return provider.get();
}
}
class MyClass {
boolean myProvider = false;
}
class MyClassProvider implements Provider<MyClass> {
Provider<MyClass> provider;
@com.google.inject.Inject
public MyClassProvider(Provider<MyClass> provider) {
this.provider= provider;
}
@Override
public MyClass get() {
MyClass c = provider.get();
c.myProvider = true;
return c;
}
public String toString() {
return "Our provider";
}
}
如果您不希望MyClass的用户使用命名提供程序,那么我能够使它起作用的唯一方法是扩展
MyClass
并让MyClassProvider
需要“ MyClass2
”提供程序。作为一种解决方案,它有气味,但可以解决问题(您可以在this gist上找到代码,而不是用不好的答案来污染该答案)。您可能可以使用专用模块或子模块(因为这是“机器人腿”问题的一种变体)来执行此操作,但是我一直无法解决该问题。