您将需要在两者之一上使用绑定注释。如果您不介意 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
”提供程序。作为一种解决方案,它闻起来很有效(而不是用糟糕的答案污染这个答案,你可以在这个 gist上找到代码)。
您可以使用私有模块或子模块来做到这一点(因为它是机器人腿问题的变体),但我一直无法弄清楚如何做到这一点。