【问题标题】:How to use PicoContainer for a constructor with paramenter如何将 PicoContainer 用于带参数的构造函数
【发布时间】:2014-11-28 10:00:44
【问题描述】:

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

我该如何解决?

【问题讨论】:

  • contex.addComponent(B.class, new A(new C()));? (听说过PicoContainer,但还没用过。)
  • 我是新手,正如我所说的,我认为这不是正确的做法。

标签: java ioc-container picocontainer


【解决方案1】:

这不是那么直观

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

更多信息here

干杯

【讨论】:

  • 他需要同时注入构造函数和字段
  • 我希望我明白你的意思,你可以在之前的一个答案中看到我是如何做到的,请检查是否是你的意思。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我最终注入了构造函数

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

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

        @Inject
        private IC c;
    

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

    【讨论】:

    • 嗨,但这样做也不起作用,因为它一直说 B 没有初始化...:/
    猜你喜欢
    • 2015-02-03
    • 2011-10-08
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    相关资源
    最近更新 更多