如何使用Guice的AssistedInject?

时间:2012-01-23 17:53:20

标签: java guice guice-3

我已阅读https://github.com/google/guice/wiki/AssistedInject,但没有说明如何传递AssistedInject参数的值。 injector.getInstance()调用会是什么样的?

1 个答案:

答案 0 :(得分:147)

检查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);