Guice Generic Provider(Provider本身是通用的,而不是它绑定的类)

时间:2013-10-09 17:34:56

标签: java inheritance dependency-injection guice constructor-injection

有很多关于如何使用Guice Provider绑定到泛型类的在线资源,例如wiki entries like thisSOF questions like this。但是,我无法找到有关如何使用通用提供程序的资源。

例如,假设我有以下内容:

public interface Foo {
    ...
}

public class Bar implements Foo {
    ...
}

如您所见,Bar有一个注入参数,必须在构造函数中。在我的情况下,我们无法将此参数移动到字段或方法注入。

所以,现在我想为Foo编写一个Provider,但它返回一个Bar实例。像这样:

@Singleton
public class FooProvider<T extends Foo> extends Provider<Foo> {
    @Inject
    public FooProvider(Object someParameterWeMustInjectIntoConstructor) {
        ...
    }
    ...
    @Override
    public Foo get() {
        return new Bar(...);
    }
    ...
}

注意这个类是如何依赖于Guice注入本身的单例,因此必须使用.toProvider(FooProvider.class)配置Provider。我们也只能使用构造函数注入而不是方法和字段注入,可能是因为具有此Provider的类型层次结构。

我试图找到某种方法来使用.toProvider(FooProvider<Bar>.class),但我们都知道这不是有效的Java语法。有谁知道如何在模块中使用Guice绑定器的.toProvider(Class<? extends Provider>)方法,以便我可以使用通用Provider来创建实现的具体类?如果我的问题有点令人困惑,请告诉我。

1 个答案:

答案 0 :(得分:7)

toProvider(new TypeLiteral<FooProvider<Bar>>() { });