guice FactoryModuleBuilder().implements() 是可选的吗?
Is guice FactoryModuleBuilder().implements() optional?
class TestClass {
@Inject
public TestClass(String arg1, @Assisted String arg2) {
System.out.printf("TestClass(%s, %s)\n", arg1, arg2);
}
}
interface TestFactory {
TestClass makeTestClass(String extraArg);
}
class Main {
@Inject
public TestFactory factory;
public static void main(String[] args) {
Injector i = Guice.createInjector(
new AbstractModule() { @Override protected void configure() {
bind(String.class).toInstance("any string");
install(new FactoryModuleBuilder().build(TestFactory.class));
}}
);
Main m = i.getInstance(Main.class);
m.factory.makeTestClass("assisted");
}
}
此代码可以正常工作并打印 "TestClass(any string, assisted)"
但是根据文档,我必须调用
install(new FactoryModuleBuilder()
.implement(TestClassInterface.class, TestClass.class)
.build(TestFactory.class));
什么时候以及为什么我真的必须使用 implement()?仅何时进行命名绑定?
当工厂方法的 return 类型与您希望 Guice 实例化的类型不同时,您需要使用 .implement()
。如果您的工厂方法 return 是接口类型,通常会发生这种情况。您使用 .implement()
告诉 Guice 它应该创建的具体 class 类型。
class TestClass {
@Inject
public TestClass(String arg1, @Assisted String arg2) {
System.out.printf("TestClass(%s, %s)\n", arg1, arg2);
}
}
interface TestFactory {
TestClass makeTestClass(String extraArg);
}
class Main {
@Inject
public TestFactory factory;
public static void main(String[] args) {
Injector i = Guice.createInjector(
new AbstractModule() { @Override protected void configure() {
bind(String.class).toInstance("any string");
install(new FactoryModuleBuilder().build(TestFactory.class));
}}
);
Main m = i.getInstance(Main.class);
m.factory.makeTestClass("assisted");
}
}
此代码可以正常工作并打印 "TestClass(any string, assisted)"
但是根据文档,我必须调用
install(new FactoryModuleBuilder()
.implement(TestClassInterface.class, TestClass.class)
.build(TestFactory.class));
什么时候以及为什么我真的必须使用 implement()?仅何时进行命名绑定?
当工厂方法的 return 类型与您希望 Guice 实例化的类型不同时,您需要使用 .implement()
。如果您的工厂方法 return 是接口类型,通常会发生这种情况。您使用 .implement()
告诉 Guice 它应该创建的具体 class 类型。