14

Guiceについての私の理解は次のとおりです。

  • コンストラクターレベルのインジェクション(@Inject public class Widget(Dep one, Dep two))は、Guiceが;を介して呼び出されるたびに、常にそのコンストラクターをインジェクトすることを意味します。Injector
  • メソッドレベルのインジェクション(@Inject public void setDepOne(Dep one))は、オブジェクトがGuiceを使用して作成されている限り、Guiceが呼び出されるたびに常にそのメソッドをインジェクトすることを意味します。WidgetInjector

これらの2つの仮定は正しいですか?そうでない場合は、明確にしてください!

だから私がハングアップしているのは、フィールドレベルの注入の意味は何ですか?

@Inject private Dep one;

これは、オブジェクトがGuiceインジェクターを介して作成されるときに、Guiceが常にプロパティを注入することを意味しますか?その場合、コンストラクターレベルのインジェクションと競合すると思います。

たとえば、次の場合に競合/エラーが発生しますか?

public class Widget {
    @Inject private Dep one;

    private Dep two;

    // Dep one already injected as a field!
    @Inject public Widget(Dep one, Dep two) {
        // ...
    }
}

前もって感謝します!

4

2 に答える 2

24

Guice は常に、すべてのフィールド、メソッド、および で注釈が付けられた単一のコンストラクターを注入します@Inject。コンストラクターは常に最初に注入されることに注意してください。そのため、注釈付きフィールドは実際にその注入を上書きします。この変更された例を見てください:

class Widget {
    @Inject
    private Dep one;

    @Inject
    public Widget(Dep one) {
        this.one = one;
        System.out.println(one);
    }

    public void printDependency() {
        System.out.println(one);
    }
}

class Dep {}

public class MyMain {
    public static void main(String[] args) {
        Injector i = Guice.createInjector();
        i.getInstance(Widget.class).printDependency();

    }
}

実行すると、次のようになります。

com.example.Dep@63238bd2
com.example.Dep@69198891

明らかに 2 つの異なるオブジェクトです。最初の行はコンストラクターです。2つ目はフィールドインジェクションです。

Guice コード サンプルを書くときの冗長性を減らすことを除いて、フィールド インジェクションの使用法を見つけることはほとんどありません。本番コードでは、コードのテストが難しくなるため、賢明ではありません。

于 2012-04-15T03:11:14.710 に答える
1

あなたの仮定は正しいです。この特定のケースでは、Guice は 2 回 (コンストラクターを介して 1 回、フィールドを介して 1 回) 注入すると信じてoneいます。

于 2012-04-13T14:35:40.097 に答える