我遇到了多个接口实现的问题,或者将它们作为List注入。 这个问题是对问题的直接跟进:
Java inject implementation using TypeLiteral
所以我将havilly引用这些例子并参考他们的解决方案。
我有一个界面:
public interface IImplementMe {
public String getValue();
}
和
我有两个来自项目绑定的不同模块的IImplementMe
接口的实现:
register(IImplementMe.class).annotatedWith(Names.named("someName")).to(SomeImplementation.class);
所有内容都压缩到模块中的列表
private static class CustomTypeLiteral extends TypeLiteral<List<IImplementMe>> {
}
bind(new CustomTypeLiteral()).toRegistry();
有两个假设(这使得这个故事与链接问题不同)
IImplementMe
的实施,特别是如果它们是单身人士(如果真的需要,我可以强迫它)同样,我想在@Singleton类中注入所有这些的List,并在需要时调用它们。
@Singleton
class SomeEndpoint {
@Inject
public SomeEndpoint(final List<IImplementMe> implementations){
///
}
}
问题:是否保证Guice会接受所有实施?我知道他们在构造函数中不可用(列表将是空的)但是之后我应该刷新列表,因为我理解Guice。我最担心的情况是实现不是单例,而且我的类别之外的任何其他地方都没有使用它来注入List(示例中为SomeEndpoint
)(我担心他们会这样做)永远不会被初始化,所以永远不会添加到列表中。)
另外一个想法:我没有使用Multibinder(如果可能的话我想避免使用它,因为我不想强迫其他用户使用它,如果他们可以,它会更清楚一点只需注册它的模块的IImplementMe
@Named实现。