Java使用TypeLiteral从多个模块注入实现

时间:2017-04-07 12:33:08

标签: java dependency-injection guice typeliteral

我遇到了多个接口实现的问题,或者将它们作为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();

有两个假设(这使得这个故事与链接问题不同)

  1. 我不太了解IImplementMe的实施,特别是如果它们是单身人士(如果真的需要,我可以强迫它)
  2. 它们绑定在不直接由我管理的不同模块中(我不想自己绑定这些实现)
  3. 同样,我想在@Singleton类中注入所有这些的List,并在需要时调用它们。

    @Singleton
    class SomeEndpoint {
        @Inject
        public SomeEndpoint(final List<IImplementMe> implementations){
        ///
        }
    }
    

    问题:是否保证Guice会接受所有实施?我知道他们在构造函数中不可用(列表将是空的)但是之后我应该刷新列表,因为我理解Guice。我最担心的情况是实现不是单例,而且我的类别之外的任何其他地方都没有使用它来注入List(示例中为SomeEndpoint)(我担心他们会这样做)永远不会被初始化,所以永远不会添加到列表中。)

    另外一个想法:我没有使用Multibinder(如果可能的话我想避免使用它,因为我不想强迫其他用户使用它,如果他们可以,它会更清楚一点只需注册它的模块的IImplementMe @Named实现。

0 个答案:

没有答案