使用Pico Container注册实施列表

时间:2016-01-28 12:15:45

标签: dependency-injection java-8 picocontainer

我有一个界面

public interface IInterface{}

我有一个这个界面的实现列表:

public class MyClass1 implements IInterface{}
public class MyClass2 implements IInterface{}

我想与Pico Container合作:

  1. 注册 IInterface 的所有实施,以便能够将其解析为列表:

    public class MyTest {
        public MyTest(IInterface[] list){}
    }
    
  2. 另一种选择是能够使用命名密钥注册实现:

    container.addComponent(IInterface.class, MyClass1.class, "name1");
    container.addComponent(IInterface.class, MyClass2.class, "name2");
    

    能够做类似的事情:

    container.getComponent(IInterface.class, "name2");
    
  3. 至少有第一个问题的内置解决方案吗?

    UPD

    1. 在Pico中发现这种实现很奇怪而且不直观。
    2. 能够注入阵列是必要的:

      container.addComponent(MyClass1.class);
      container.addComponent(MyClass2.class);
      container.addComponent(MyTest.class);
      MyTest test = container.getComponent(MyTest.class);
      

      这将注入所有实现的数组。但这种行为非常不明确,也不直观。至于我,最好注册成对。

1 个答案:

答案 0 :(得分:1)

第1部分与您描述的完全一致。只需按常规方式注册任意数量的实现,然后将它们作为数组注入(不需要任何注入参数)或collection。您可以在sample project // ServerRegistrar,AppPico

中查看包含数组的示例

对于第二部分,有几个内置的解决方案,例如使用命名注释(就像在Guice中一样)我个人不赞成。或使用injection parameters(接近您的期望)。或者使用一些自定义方法,如果你愿意,我可以详细解释。