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

それほど直感的ではない

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 がデフォルトのコンストラクターではなくパラメーター化されたコンストラクターを呼び出せるようにする「最も貪欲な」条件を満たします。

詳細はこちら

乾杯

于 2014-11-28T10:21:05.413 に答える
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 に答える