Как использовать Guice AssistedInject?

Я читал https://github.com/google/guice/wiki/AssistedInject, но не говорит, как передать значения аргументов AssistedInject. Как выглядел бы вызов injector.getInstance()?

Ответ 1

Проверьте javadoc класса FactoryModuleBuilder.

AssistedInject позволяет динамически настраивать Factory для класса вместо его кодирования. Это часто полезно, когда у вас есть объект, у которого есть зависимости, которые должны быть введены, и некоторые параметры, которые должны быть указаны при создании объекта.

Пример из docummentaiton - это RealPayment

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

Смотрите, что CreditService и AuthService должны быть введены контейнером, но startDate и количество должно указываться разработчиком во время создания экземпляра.

Итак, вместо инъекции Payment вы вводите PaymentFactory с параметрами, отмеченными как @Assisted в RealPayment

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

И factory должен быть привязан

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

Конфигурированный factory может быть введен в ваши классы.

@Inject
PaymentFactory paymentFactory;

и используется в вашем коде

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