次のコードがあるとします。
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
どのようにインスタンス化しますか?Minerals
Granite