Guiceは、Googleによりオープンソースで開発されているDI(Dependency Injection)フレームワークである。
Apache License 2.0
プログラムをモジュールやクラスに分割して構築すると、それらの間には依存性(Depencency)が生じる。この依存性が強すぎると、モジュール性(コード再利用のし易さ)やテスト可用性(テストのし易さ)が低くなってしまう。 Dependency Injection (DI) とは、目的に合わせてクラス間の依存関係を柔軟に切り替えられるようにする設計思想である。このDIに基づいた設計を行うことで、モジュール性とテスト可用性の高いプログラムを開発できる。
DIコンテナとは、アプリケーションに依存性注入(DI: Dependency Injection)機能を提供するフレームワークである。DIコンテナの目的は、設定にしたがって自動的にインスタンスを組み立てて提供することである。
Google Guiceでは、次のクラスやインタフェースを作成する必要がある。
クラス/インタフェース | 説明 |
---|---|
クライアントクラス | サービスを使用するクラスで、サービスのインタフェースを通じて、サービスの実装オブジェクトへの参照を持つ。 |
サービスのインタフェース | 依存オブジェクトのインタフェースを定義する。 |
サービスの実装クラス | 依存オブジェクトの定義で、サービスのインタフェースを実装する必要がある。 |
Guiceでは次のアノテーションを使うことができる。
プロバイダメソッドは、Moduleの関数として定義したメソッドを、コンポーネントを取得する際のProviderとして使う機能である。Module実装クラス又はAbstractModule実装クラスの記述で@Provideアノテーションを強したメソッドを記述すればよい。メソッドの名前は何でもよく、メソッドの戻り値はバインディングされたタイプである。インジェクタは、このタイプのインスタンスが必要になると、このメソッド呼び出す。
MavenからGoogle Guiceを利用するには、pom.xmlに次の記述を追記する。
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>5.0.1</version>
</dependency>
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);
}
}
依存性注入パターンは、モジュール化されたテスト可能なコードに繋がる。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);
}
}
@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