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

ecb*_*die 4 java inheritance dependency-injection guice constructor-injection

有一个关于如何使用吉斯提供商绑定到一个通用类,如很多网络资源的维基条目这样这样的SOF的问题.但是,我无法找到有关如何使用通用本身的提供程序的资源.

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

public interface Foo {
    ...
}

public class Bar implements Foo {
    ...
}
Run Code Online (Sandbox Code Playgroud)

如您所见,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(...);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

Tav*_*nes 8

toProvider(new TypeLiteral<FooProvider<Bar>>() { });
Run Code Online (Sandbox Code Playgroud)