3

次のコードがあるとします。

public interface Rock {
    // Minerals are a concrete class; omitted for brevity
    public Minerals getMinerals();
}

public class Granite implements Rock {
    // @Inject #1 - field
    private Minerals minerals;

    // @Inject #2 - constructor
    public Granite(Minerals mins) {
        super();
        setMinerals(mins);
    }

    public Minerals getMinerals() {
        return minerals;
    }

    // @Inject #3 - setter
    public void setMinerals(Minerals mins) {
        minerals = mins
    }
}

public class RockModule extends AbstractModule {
    public void configure(Binder guiceBinder) {
        Minerals m = new Minerals(true, 3, MineralEnum.Sedimentary);

        guiceBinder.bind(Minerals.class).toInstance(m);
        guiceBinder.bind(Rock.class).to(Granite.class);
    }
}

public class TestInjections {
    public static void main(String[] args) {
        RockModule mod = new RockModule();
        Injector injector = Guice.createInjector(mod);

        Granite gran = injector.getInstance(Granite.class);
    }
}

ここでは変数である3つのアノテーションをコメントアウトしました。3@Injectつのケースすべて(フィールドレベル、コンストラクターレベル、またはセッターレベルのインジェクション)でGuiceがどのように動作するのか疑問に思っています。

  • インスタンスには、モジュールで構成されたGraniteインスタンスが常に注入されますか?Mineralsインジェクションタイプ(3つのそれぞれ)は、インジェクターによって返されるインスタンスにどのように影響しGraniteますか?またはそれらはすべて同じですか?
  • Mineralsモジュールに明示的にバインドしたことがなく、パブリックの引数なしコンストラクターが定義されていない場合はどうなりますか? 3つのインジェクションシナリオすべてについて、Guiceはリクエストされたオブジェクトに対して返されるインスタンスをMineralsどのようにインスタンス化しますか?MineralsGranite
4

1 に答える 1

3
  1. Mineralsどちらの注入手法を選択しても、常に注入されGraniteますが、一部の注入は他の注入よりも「クリーン」です。たとえば、オプション1では注入の実行方法を制御できず、オプション3ではクラスを制御できません。不変。
  2. Mineralsバインドされておらず、パブリックの引数のないコンストラクターがなく、コンストラクターがない場合@Inject、を使用しない限り、Guiceは例外をスローします@Inject(optional = true)
于 2012-04-12T17:44:31.827 に答える