Java 如何为带参数的构造函数使用PicoContainer
我正在使用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{
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;