0

我正在使用 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的依赖不满足。

我该如何解决?

4

3 回答 3

0

我最终注入了构造函数

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

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

并在 AI 类中注入了构造函数:

    @Inject
    private IC c;

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

于 2014-12-01T09:43:32.560 回答
0

它不是那么直观

public interface ThreadPool {  
 void setSize(int);  
}  

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

为了调用 MyComp(ThreadPool pool) 构造函数,您必须执行以下操作:

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 调用参数化构造函数而不是默认构造函数。

更多信息在这里

干杯

于 2014-11-28T10:21:05.413 回答
0

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

于 2014-11-29T15:27:32.987 回答