guice FactoryModuleBuilder()。implements()是否可选?

时间:2016-10-20 14:01:29

标签: java guice

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(任何字符串,辅助)”

但是通过doc,我必须称之为

install(new FactoryModuleBuilder()
    .implement(TestClassInterface.class, TestClass.class)
    .build(TestFactory.class));

我何时以及为什么必须使用implement()?只有当命名绑定?

1 个答案:

答案 0 :(得分:2)

如果工厂方法的返回类型与Guice要实例化的类型不同,则需要使用.implement()。通常,如果工厂方法返回接口类型,则会发生这种情况您使用.implement()告诉Guice它应该创建的具体类类型。