私はこのクラスを持っています:
public class House {
private final Door door;
private final Window window;
private final Roof roof;
@Inject
public House(Door door, Window window, Roof roof) {
this.door = door;
this.window = window;
this.roof = roof;
}
}
ここで、Door
、Window
、およびRoof
は具象クラスです。このシナリオのモジュールを実装したい場合、次のようにします。
public class HouseModule extends AbstractModule {
@Override
protected void configure() {
bind(Door.class).to(Door.class);
bind(Window.class).to(Window.class);
bind(Roof.class).to(Roof.class);
}
}
しかし、これが具体的なクラスをバインドする正しい方法なのか、それとももっと簡単な方法があるのかと思います。これにはもっと簡単な方法があると思います。
[〜#〜] edit [〜#〜]
これを試してみたところ、うまくいかないようです:
1) Binding points to itself.
at de.tarent.guice.ex._1.HouseModule.configure(HouseModule.Java:10)
編集2
バインディングはまったく必要ないようです:
Injector injector = Guice.createInjector();
House house = injector.getInstance(House.class);
また動作するようです。
Guiceの Just-In-Timeバインディング は、まさにあなたが望むことをします。 Door
、Window
、およびRoof
が次の要件を満たしていると仮定します(Guice documentation から引用)。
引数なしのパブリックコンストラクタ、または@Injectアノテーション付きのコンストラクタのいずれか
空のモジュール実装で十分です:
public class HouseModule extends AbstractModule {
@Override
protected void configure() {
}
}
これは行く方法です:
protected void configure() {
bind(Door.class);
bind(Window.class);
bind(Roof.class);
}
Guiceが言うように、これらは具象クラスなので、それらを自分自身にバインドすることはできません:-)
Binder
のドキュメントをご覧ください。
bind(ServiceImpl.class);
このステートメントは本質的に何もしません。 「
ServiceImpl
クラスをそれ自体にバインド」し、Guiceのデフォルトの動作を変更しません。Module
クラスが提供するサービスの明示的なマニフェストとして機能することを希望する場合は、これを引き続き使用できます。また、まれに、Guiceが明示的に指定されない限り、インジェクターの作成時にバインディングを検証できない場合があります。
@Inject
は、注入に自動的に使用可能です。しかし、それは開発者(あなた)がモジュールで何が設定されているかを知るのに役立ちます。
インターフェースは、インターフェースと実装クラスをリンクするために必要です(例えば、テスト環境の他の実装に変更するため)。ただし、具体的なクラスがあるため、バインドする必要はありませんto、クラスをバインドするだけです