我正在使用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的依赖性不满意。
我怎么解决?
答案 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类的任何实现。