始め方
依存性注入により、オブジェクトは依存性をコンストラクタ引数として受け取る。 オブジェクトを作成するにあたっては、まずその依存性をビルドする必要がある。 しかし、そのれらの依存性をビルドするには、そのまた依存性が必要になるのである。 というように永遠に続く。 したがって、あるオブジェクトをビルドするには、オブジェクトグラフのビルドが必要になるのである。
手作業でオブジェクトグラフをビルドすることは、かなり大変でエラーも出やすく、そしてテストも難しくなる。 その代わりにGuiceはオブジェクトグラフを代わりに作ってくれる。 しかし最初に、Guiceが正確なグラフを作れるように構成しておかなくてはいけない。
我々は、CreditCardProcessorとTransactionLogをコンストラクタ引数として受け取るRealBillingServiceクラスを例としてあげた。 RealBillingServiceのコンストラクタがGuiceによって起動されるように、@Injectアノテーションをつけた。
class RealBillingService implements BillingService {
private final CreditCardProcessor processor;
private final TransactionLog transactionLog;
@Inject
RealBillingService(CreditCardProcessor processor,
TransactionLog transactionLog) {
this.processor = processor;
this.transactionLog = transactionLog;
}
@Override
public Receipt chargeOrder(PizzaOrder order, CreditCard creditCard) {
...
}
}PaypalCreditCardProcessorとDatabaseTransactionLogを使って、RealBillingServiceをビルドしたい。 Guiceは型をその実装にマップする。 Moduleはバインディングのコレクションであり、英文のようなメソッドコールによってそのバインディングが指定される。
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
/*
* TransactionLogがあったら、その依存性をDatabaseTransactionLogを使って解決しろと
* Guiceに伝える。
*/
bind(TransactionLog.class).to(DatabaseTransactionLog.class);
/*
* 同様にCreditCardProcessorをPaypalCreditCardProcessorで解決しろと
* Guiceに伝える。
*/
bind(CreditCardProcessor.class).to(PaypalCreditCardProcessor.class);
}
}モジュールはインジェクタのビルディングブロックであり、インジェクタはGuiceのオブジェクトグラフビルダである。 まず最初にインジェクタを作成し、RealBillingServiceをビルドすることにしよう。
public static void main(String[] args) {
/*
* Guice.createInjector()はあなたのモジュールを受け取り、新しいインジェクタを返す。
* 大抵のアプリでは、このメソッドコールは一度だけmain()メソッドの中で行われる。
*/
Injector injector = Guice.createInjector(new BillingModule());
/*
* インジェクタを取得したので、オブジェクトをビルドしよう。
*/
RealBillingService billingService = injector.getInstance(RealBillingService.class);
...
}billingServiceをビルドすることにより、Guiceを使って小さなオブジェクトグラフを作成することになる。 このグラフには、Billing Serviceとその依存であるCredit Card ProcessorとTransaction Logが含まれる。
