【发布时间】: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