Java使用TypeLiteral注入实现

时间:2016-04-18 09:31:36

标签: java guice constructor-injection typeliteral

我有一个提供界面的项目,我们称之为IImplementMe,我想将其注入我的项目中。这个接口将由各种生产者实现,所以我需要注入所有实现。我正在尝试使用TypeLiteral。

以下是制作人的代码:

register(IImplementMe.class).to(SomeImplementation.class);

在我的注册表课程中,我有@Inject public SomeEndpoint(final List<IImplementMe> implementations){ /// }

然后,在我的项目中,我这样注入:

private static class MarketDataSetTypeLiteral extends TypeLiteral<List<IImplementMe>> {
}
bind(new MarketDataSetTypeLiteral()).toRegistry();

和我一样绑定它

SU - 1 /2016

我确保我的SomeIMplementation构造函数被调用,但在我的端点中List是空的,因此没有提供实现。我正在使用guice注射。有什么想法吗?

LE:事实证明,在创建端点类之后创建了提供的实现(在创建时它会注入空列表的引用)。在生命周期的后期,引用会随着实现而更新,所以我实际上可以在guice完成之后访问它。

我猜这是由于maven依赖关系,以及guice如何处理实例化。由于生产者必须依赖我的项目,我想它最后会被实例化,因此导致我最初的问题。

1 个答案:

答案 0 :(得分:0)

您正在寻找多重绑定 - &gt; https://github.com/google/guice/wiki/Multibindings

public class IImplementMeModule extends AbstractModule {
  public void configure() {
    Multibinder< IImplementMe > uriBinder = Multibinder.newSetBinder(binder(), IImplementMe.class);
    uriBinder.addBinding().to(SomeImplementationOfIImplementMe.class);
    uriBinder.addBinding().to(AnotherImplementationOfIImplementMe.class);

    ... // bind plugin dependencies, such as our Flickr API key
  }
}

然后你可以注入IImplemetnMe的集合,如下所示

@Inject TweetPrettifier(Set<IImplemetnMe> implementations)
  

我建议你看一下MapBindings,它允许你为每个实现提供密钥,然后你就可以将你的绑定注入一个Map