Upload page content

You can upload content for the page named below. If you change the page name, you can also upload content for another page. If the page name is empty, we derive the page name from the file name.

File to load page content from
Page name
Comment

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が含まれる。