web-dev-qa-db-ja.com

GuiceのAssistedInjectの使用方法

https://github.com/google/guice/wiki/AssistedInject を読んだことがありますが、AssistedInject引数の値を渡す方法については言及していません。 injection.getInstance()呼び出しはどのようになりますか?

77
Noel Yap

FactoryModuleBuilder クラスのjavadocを確認してください。

AssistedInjectを使用すると、自分でコーディングする代わりに、クラスのFactoryを動的に構成できます。これは、注入する必要のある依存関係を持つオブジェクトと、オブジェクトの作成中に指定する必要があるいくつかのパラメーターがある場合に役立ちます。

ドキュメントの例はRealPaymentです

public class RealPayment implements Payment {
   @Inject
   public RealPayment(
      CreditService creditService,
      AuthService authService,
      @Assisted Date startDate,
      @Assisted Money amount) {
     ...
   }
 }

CreditServiceAuthServiceはコンテナによって注入されるべきですが、startDateとamountはインスタンスの作成中に開発者によって指定されるべきであることを参照してください。

したがって、Paymentを注入する代わりに、PaymentFactory@Assistedとしてマークされたパラメーターを使用してRealPaymentを注入します。

public interface PaymentFactory {
    Payment create(Date startDate, Money amount);
}

そして、工場をバインドする必要があります

install(new FactoryModuleBuilder()
     .implement(Payment.class, RealPayment.class)
     .build(PaymentFactory.class));

構成されたファクトリーをクラスに注入できます。

@Inject
PaymentFactory paymentFactory;

コードで使用されます

Payment payment = paymentFactory.create(today, price);
150