有很多关于如何使用Guice Provider绑定到泛型类的在线资源,例如wiki entries like this和SOF 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来创建实现的具体类?如果我的问题有点令人困惑,请告诉我。
答案 0 :(得分:7)
toProvider(new TypeLiteral<FooProvider<Bar>>() { });