web-dev-qa-db-ja.com

Guice Beginner-具象クラスをバインドする方法は?

私はこのクラスを持っています:

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;
    }
}

ここで、DoorWindow、および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);

また動作するようです。

40
helpermethod

Guiceの Just-In-Timeバインディング は、まさにあなたが望むことをします。 DoorWindow、およびRoofが次の要件を満たしていると仮定します(Guice documentation から引用)。

引数なしのパブリックコンストラクタ、または@Injectアノテーション付きのコンストラクタのいずれか

空のモジュール実装で十分です:

public class HouseModule extends AbstractModule {
    @Override
    protected void configure() {
    }
}
29
edwardw

これは行く方法です:

protected void configure() {
    bind(Door.class);
    bind(Window.class);
    bind(Roof.class);
}

Guiceが言うように、これらは具象クラスなので、それらを自分自身にバインドすることはできません:-)

Binder のドキュメントをご覧ください。

bind(ServiceImpl.class);

このステートメントは本質的に何もしません。 「ServiceImplクラスをそれ自体にバインド」し、Guiceのデフォルトの動作を変更しません。 Moduleクラスが提供するサービスの明示的なマニフェストとして機能することを希望する場合は、これを引き続き使用できます。また、まれに、Guiceが明示的に指定されない限り、インジェクターの作成時にバインディングを検証できない場合があります。

@Inject は、注入に自動的に使用可能です。しかし、それは開発者(あなた)がモジュールで何が設定されているかを知るのに役立ちます。

45
Jalayn

インターフェースは、インターフェースと実装クラスをリンクするために必要です(例えば、テスト環境の他の実装に変更するため)。ただし、具体的なクラスがあるため、バインドする必要はありませんto、クラスをバインドするだけです

6
korifey