Google Guice DIコンテナ

Guiceは、Googleによりオープンソースで開発されているDI(Dependency Injection)フレームワークである。

ライセンス

Apache License 2.0

DIコンテナ

プログラムをモジュールやクラスに分割して構築すると、それらの間には依存性(Depencency)が生じる。この依存性が強すぎると、モジュール性(コード再利用のし易さ)やテスト可用性(テストのし易さ)が低くなってしまう。 Dependency Injection (DI) とは、目的に合わせてクラス間の依存関係を柔軟に切り替えられるようにする設計思想である。このDIに基づいた設計を行うことで、モジュール性とテスト可用性の高いプログラムを開発できる。

DIコンテナとは、アプリケーションに依存性注入(DI: Dependency Injection)機能を提供するフレームワークである。DIコンテナの目的は、設定にしたがって自動的にインスタンスを組み立てて提供することである。

Google Guiceでは、次のクラスやインタフェースを作成する必要がある。

Google Guiceに必要なクラスとインタフェース
クラス/インタフェース 説明
クライアントクラス サービスを使用するクラスで、サービスのインタフェースを通じて、サービスの実装オブジェクトへの参照を持つ。
サービスのインタフェース 依存オブジェクトのインタフェースを定義する。
サービスの実装クラス 依存オブジェクトの定義で、サービスのインタフェースを実装する必要がある。
Dependency Injection
Figure 1. Dependency Injection

アノテーション

Guiceでは次のアノテーションを使うことができる。

@Provides

プロバイダメソッドは、Moduleの関数として定義したメソッドを、コンポーネントを取得する際のProviderとして使う機能である。Module実装クラス又はAbstractModule実装クラスの記述で@Provideアノテーションを強したメソッドを記述すればよい。メソッドの名前は何でもよく、メソッドの戻り値はバインディングされたタイプである。インジェクタは、このタイプのインスタンスが必要になると、このメソッド呼び出す。

Maven

MavenからGoogle Guiceを利用するには、pom.xmlに次の記述を追記する。

<dependency>
  <groupId>com.google.inject</groupId>
  <artifactId>guice</artifactId>
  <version>5.0.1</version>
</dependency>

Module

Google Guiceのモジュール内のconfigureメソッドでバインディングを指定する。

package com.segakuin.guice;
import com.google.inject.AbstractModule;

public class EmployeeModule extends AbstractModule {
  @Override
  protected void configure() {
    bind(Employee.class).to(Salesperson.class);
  }
}

Injector

依存性注入パターンは、モジュール化されたテスト可能なコードに繋がる。Google Guiceは依存性注入パターンを簡単に書くことができる。まず、インタフェースとその実装をどのようにマッピングするかを指示する必要がある。この設定は、XMLファイルではなく、Google Guiceのモジュールで行われる。モジュールは、Moduleインタフェースを実装したクラスである。

Google Guiceのインジェクタを使って、バインドされたクラスのインスタンスを取得することができる。

package com.segakuin.guice;
import com.google.inject.Guice;
import com.google.inject.Injector;

public class Example {
  public static void main(String[] args) {
    Injector injector = Guice.createInjector(new EmployeeModule());
    Employee employee = injector.getInstance(Employee.class);
  }
}

Provider

@Provides アノテーションを付けたメソッドが複雑になってきたら、それを独自のクラスに移すことを検討した方がよい。プロバイダクラスは、Google GuiceのProviderインタフェースを実装したもので、値を供給するための簡単で一般的なインタフェースである。

public interface Provider<T> {
  T get();
}

参考文献

Google (2021) Google Guice 5.0.1 API

Google (2021) Guice

MvnRepository (2021) Google Guice Core Library