【发布时间】:2013-10-09 17:34:56
【问题描述】:
网上有很多关于如何使用Guice Provider 绑定泛型类的资源,例如wiki entries like this 和SOF questions like this。但是,我很难找到有关如何使用本身是通用的 Provider 的资源。
例如,假设我有以下内容:
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>) 方法,以便我可以使用通用提供程序来创建实现的具体类?如果我的问题有点令人困惑,请告诉我。
【问题讨论】:
-
你必须使用反射
-
不清楚为什么必须使用
FooProvider<T extends Foo> extends Provider<Foo>而不是FooBarProvider extends Provider<Foo> { ... return new Bar(...); }。如果你真的需要这样的东西,请你详细说明为什么你需要它? -
我接受的答案就是我想要的:)
标签: java inheritance dependency-injection guice constructor-injection