【问题标题】:Java inject implementation using TypeLiteral使用 TypeLiteral 的 Java 注入实现
【发布时间】:2016-08-09 23:11:56
【问题描述】:

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

这是生产者的代码:

@Singleton
public class SomeImplementation implements IImplementMe {

private final String value;

@Inject
public SomeImplementation(final SomeOtherConfig configuration) {
    this.value= configuration.getValue();
}

@Override
public String getValue() {
    return value;
}
}

在我的注册表类中我有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();

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

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

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

【问题讨论】:

  • 我不确定我理解为什么你有一个CustomTypeLiteral(你的意思是MarketDataSetTypeLiteral?)或者你想用toRegistry做什么。通常,您似乎正在尝试使用与Multibindings 类似的功能,但使用您自己的注册表。你能告诉我们更多bind(...).toRegistry()应该做什么,或者你是如何实现的吗?
  • 是的,抱歉,它应该是 MarketDataSetTypeLiteral。而对于注册中心的实现,基本上就是yar注册中心的实现(链接:github.com/javabits/yar/blob/master/yar-guice/src/main/java/org/…)。

标签: java guice constructor-injection typeliteral


【解决方案1】:

您正在寻找多重绑定 -> 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

【讨论】:

  • 谢谢米兰,这似乎是一个不错的选择,会看看:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多