0

ユーザー ガイドとすべてを確認しましたが、依存関係を挿入しようとするときに Google Guice を使用するように既存のコードを変更する方法を正確に理解していません。簡単にするために、この簡単な例を作成しました。誰かがこの簡単な例で説明できれば、本当に感謝しています!

私が持っていると言う

public Class A {

    private int count = 0;

    public A() {
    }

    public int getCount() {

      return count;
    }

    public void setCount(int newCount) {

      this.count = newCount;
    }
}

そして別のクラス

public Class B {

    private A objectA;

    public B() {
        objectA = new A();
    }

    public void messWithCount() {
        int tempCount = objectA.getCount();
        objectA.setCount(tempCount+1);
    }
}

したがって、基本的に私の質問は次のとおりです。Google Guiceを使用objectAしてコンストラクターでの作成を抽出しB()、代わりにクラスBの依存関係として挿入して、次のようなものにするにはどうすればよいですか?

@Inject    
public B() {
}  

そして、実際に A のインスタンスをどのように注入するのでしょうか?

4

3 に答える 3

3

まず、B はクラス A にバインドするのではなく、インターフェイス ( AInterfaceなど) を使用する必要があります。Guice の主なポイントは、特定のクラスに縛られることなく、同じインターフェースの異なる実装をバインドすることです。

クラスAがAInterfaceを実装していると仮定しましょう

interface AInterface {
    public int getCount();
    public void setCount(int newCount);
}

class A implements AInterface {
    private int count   = 0;

    public A() {
        System.out.println("done!");
    }

    @Override
    public int getCount() {
        return count;
    }

    @Override
    public void setCount(int newCount) {
        this.count = newCount;
    }
}

次に、変数を注入するように指示します。

class B {
    @Inject
    private AInterface  objectA;

    public B() {}

    public void messWithCount() {
        int tempCount = objectA.getCount();
        objectA.setCount(tempCount + 1);
    }
}

static 修飾子を削除しましたが、静的にすることを主張する場合は、代わりにrequestStaticInjectionを使用してバインドする必要があります

module と呼ばれる特別なクラスで、実装AをインターフェイスAInterfaceに結び付けます。

class SimpleModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(AInterface.class).to(A.class);
    }
}

次に、Guice に B を生成するように依頼します。

public class Temptemp {
    public static void main(String[] args) {
        Injector i = Guice.createInjector(new SimpleModule());
        B b = i.getInstance(B.class);

    }
}
于 2013-10-15T01:52:34.760 に答える
0

すでに持っているものに基づく例を次に示します。

public class GuiceExample {

  static class A {
    private int count = 0;

    public A() {}

    public int getCount() {
      return count;
    }

    public void setCount(int newCount) {
      this.count = newCount;
    }
  }

  static class B {
    @Inject
    private static A objectA;

    public B() {}

    public void messWithCount() {
      int tempCount = objectA.getCount();
      objectA.setCount(tempCount+1);
    }
  }

  static class Module extends AbstractModule {
    @Override 
    protected void configure() {
      requestStaticInjection(B.class);
    }
  }

  @Test
  public void test() {
    Injector i = Guice.createInjector(new Module());
    B b = i.getInstance(B.class);
    //Do something with b
  }

}

ただし、静的注入は好ましくないことに注意してください。A を非静的にすることができ、Guice は引き続きフィールドを注入します。さらに「正しい」方法は、requestStaticInjection呼び出しをドロップして、次のように A を構築引数として追加することです。

  static class B {
    private A objectA;

    @Inject
    public B(A objectA) {
      this.objectA = objectA;
    }

    ...
  }
于 2013-10-15T01:25:29.747 に答える