始め方
依存性注入により、オブジェクトは依存性をコンストラクタ引数として受け取る。 オブジェクトを作成するにあたっては、まずその依存性をビルドする必要がある。 しかし、そのれらの依存性をビルドするには、そのまた依存性が必要になるのである。 というように永遠に続く。 したがって、あるオブジェクトをビルドするには、オブジェクトグラフのビルドが必要になるのである。
手作業でオブジェクトグラフをビルドすることは、かなり大変でエラーも出やすく、そしてテストも難しくなる。 その代わりに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が含まれる。