Guice 1.0 User's Guide和訳 その4

はじめに


前へ | 目次 | 次へ

Dependency Injection with Guice - Guiceを用いたDI

全てのサービスとそのクライアントに対してファクトリーを作り、その依存性を手動で解決するためのロジックを作成するのは「退屈」です。他のDIフレームワークのうちのいくつかは、サービスをインジェクションする個所を明示的に設定する必要さえあります。

Guiceは、これらの「お決まりの設定」を、メンテナンス性を犠牲にすること無く排除することを目標にしています。

Guiceではまず、「モジュール」を作成します。Guiceは、モジュールに対してバインダーを提供します。モジュールでは、このバインダーを利用してインターフェースとその実装をマップします。次のモジュールでは、Serviceに対してServiceImplがシングルトンスコープでマップされます。

public class MyModule implements Module {
  public void configure(Binder binder) {
    binder.bind(Service.class)
      .to(ServiceImpl.class)
      .in(Scopes.SINGLETON);
  }
}

モジュールを使って、「何をインジェクションしたいか」が設定できます。では、「何処にインジェクションしたいか」はどうやって設定すればよいのでしょう?Guiceでは、コンストラクタやメソッド、フィールドに対して「@Inject」アノテーションを利用します。

public class Client {

  private final Service service;

  @Inject
  public Client(Service service) {
    this.service = service;
  }

  public void go() {
    service.go();
  }
}

@Injectアノテーションを用いることにより、クラスのどのメンバーがインジェクションされるのかが明確に分かるようになります。

クライアントをインジェクションする場合は、直接クライアントのインスタンスを取得するか、クライアントをインジェクションされた他のクラスを使用するかのどちらかの方法を用います。