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

Java 如何为带参数的构造函数使用PicoContainer,java,ioc-container,picocontainer,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{

我正在使用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();
然后

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

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

但它说“A对字段B有不满意的依赖性

我怎样才能解决它呢?

这不是很直观

public interface ThreadPool {  
 void setSize(int);  
}  

public class MyComp {  
 private ThreadPool threadPool;
 public MyComp(ThreadPool pool) {  
    threadPool = pool;  
    threadPool.setSize(size);  
 }  
} 
要调用MyComp(线程池)构造函数,必须执行以下操作:

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,这将满足“greediest”条件,让PicoContainer调用参数化构造函数而不是默认构造函数

更多信息


干杯

容器中是否有B?如果无法将其注入构造函数中,则可以使用
为了同时注入字段和构造函数,我最后注入了构造函数

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

    context.addComponent(A.class, A.class);
在A类中,我注入了构造函数,因此:

    @Inject
    private IC c;

因此,现在根据需要,我可以向上下文添加我需要的任何C类实现。

contex.addComponent(B.class,new A(new C());
?(我听说过PicoContainer,但仍然没有使用它。)他需要同时注入构造函数和字段。我希望我理解你的意思,你可以在之前的一个答案中看到我是如何做到这一点的,请检查这是否是你的意思。嗨,但这样做也不起作用,因为它一直说B没有初始化…:/
    context.addComponent(IC.class, C.class);

    context.addComponent(A.class, A.class);
    @Inject
    private IC c;