【问题标题】:Guice Generic Provider (the Provider itself is generic, not the class it's binding to)Guice Generic Provider(Provider 本身是通用的,而不是它绑定的类)
【发布时间】: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&lt;Bar&gt;.class) 的方法,但我们都知道这不是有效的Java 语法。有谁知道我如何在模块中使用 Guice 绑定器的 .toProvider(Class&lt;? extends Provider&gt;) 方法,以便我可以使用通用提供程序来创建实现的具体类?如果我的问题有点令人困惑,请告诉我。

【问题讨论】:

  • 你必须使用反射
  • 不清楚为什么必须使用FooProvider&lt;T extends Foo&gt; extends Provider&lt;Foo&gt; 而不是FooBarProvider extends Provider&lt;Foo&gt; { ... return new Bar(...); }。如果你真的需要这样的东西,请你详细说明为什么你需要它?
  • 我接受的答案就是我想要的:)

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


【解决方案1】:
toProvider(new TypeLiteral<FooProvider<Bar>>() { });

【讨论】:

  • toProvider 需要 Provider,而不是 TypeLiteral。
  • 没及时搞清楚链接语法,试试this。
  • 太棒了!不知道我是如何在 JavaDoc 中错过这个的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 2017-06-28
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多