You can't save spelling words.

Clear message
Locked History Actions

guice/Manual/UserGuide/GettingStarted

始め方

依存性注入により、オブジェクトは依存性をコンストラクタ引数として受け取る。 オブジェクトを作成するにあたっては、まずその依存性をビルドする必要がある。 しかし、そのれらの依存性をビルドするには、そのまた依存性が必要になるのである。 というように永遠に続く。 したがって、あるオブジェクトをビルドするには、オブジェクトグラフのビルドが必要になるのである。

手作業でオブジェクトグラフをビルドすることは、かなり大変でエラーも出やすく、そしてテストも難しくなる。 その代わりにGuiceはオブジェクトグラフを代わりに作ってくれる。 しかし最初に、Guiceが正確なグラフを作れるように構成しておかなくてはいけない。

我々は、CreditCardProcessorTransactionLogをコンストラクタ引数として受け取る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) {
    ...
  }
}

PaypalCreditCardProcessorDatabaseTransactionLogを使って、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が含まれる。