如何使用PicoContainer作为带参数的构造函数

时间:2014-11-28 10:00:44

标签: java ioc-container picocontainer

我正在使用PicoContainer,我必须添加一个带有参数的构造函数的组件。 所以我有

public abstract class IA {

   @Inject
   protected B b;

   public void useB(){
        b.useSomeMethodOfB();
   }
}

public interface IC{}

public class C implements IC{}

public class A extends IA{

     private IC mSomeOtherComponent;

     public A(IC someOtherComponent){
         mSomeOtherComponent = someOtherComponent
     }
}

现在我要实现这个组件:

MutablePicoContainer context = new PicoBuilder().withAnnotatedFieldInjection().withCaching().build();

然后

contex.addComponent(A.class, new A(new C()));

但是当我在抽象类中调用useB()方法时它返回null,它不会注入任何东西。 我认为我添加组件的方式不对。我也试过了;

ComponentParameter pr = new ComponentParameter(new C());
context.addComponent(IA.class, A.class, pr);  

 ComponentParameter pr = new ComponentParameter(new C());
 context.addComponent(A.class, A.class, pr);  

但它表示" A对字段B的依赖性不满意。

我怎么解决?

3 个答案:

答案 0 :(得分:0)

这不是那么直观

public interface ThreadPool {  
 void setSize(int);  
}  

public class MyComp {  
 private ThreadPool threadPool;
 public MyComp(ThreadPool pool) {  
    threadPool = pool;  
    threadPool.setSize(size);  
 }  
} 

为了调用MyComp(ThreadPool池)构造函数,您需要执行以下操作:

DefaultPicoContainer pico = new DefaultPicoContainer();  
pico.addComponent(ThreadPool.class, DefaultThreadPool.class);  
pico.addComponent(MyComp.class, MyComp.class);

MyComp myComp = (MyComp)pico.getInstance(MyComp.class);  

正如您所注意到的那样,您在实例化MyComp之前注册了ThreadPool,这将满足“最贪婪”条件,让PicoContainer调用参数化构造函数而不是默认构造函数。

更多信息here

干杯

答案 1 :(得分:0)

容器中有B吗?如果你不能在构造函数中注入它,你可以使用它 http://picocontainer.codehaus.org/multi-injection.html注入字段和构造函数

答案 2 :(得分:0)

我最终注入了构造函数

    context.addComponent(IC.class, C.class);

    context.addComponent(A.class, A.class);

在A类中我注入了构造函数:

    @Inject
    private IC c;

所以现在根据我的需要,我可以添加到上下文中我需要的C类的任何实现。