如何使用Guice的AssistedInject?

Noe*_*Yap 79 java guice guice-3

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

Mai*_*kov 153

检查FactoryModuleBuilder类的javadoc .

AssistedInject允许您动态配置Factory类而不是自己编码.当您拥有一个具有应该注入的依赖项的对象以及在创建对象期间必须指定的某些参数时,这通常很有用.

文档中的示例是a RealPayment

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

看到它CreditService并且AuthService应该由容器注入,但startDate和amount应该由开发人员在实例创建期间指定.

因此,而不是注入Payment你注入PaymentFactory与被标记为参数@AssistedRealPayment

public interface PaymentFactory {
    Payment create(Date startDate, Money amount);
}
Run Code Online (Sandbox Code Playgroud)

一个工厂应该绑定

install(new FactoryModuleBuilder()
     .implement(Payment.class, RealPayment.class)
     .build(PaymentFactory.class));
Run Code Online (Sandbox Code Playgroud)

配置的工厂可以在您的课程中注入.

@Inject
PaymentFactory paymentFactory;
Run Code Online (Sandbox Code Playgroud)

并在您的代码中使用

Payment payment = paymentFactory.create(today, price);
Run Code Online (Sandbox Code Playgroud)

  • 这比Github上的文档更容易理解.做得好. (16认同)
  • 寻求了很多,无法找到一个更简洁明确的解释我的怀疑.非常感谢 (8认同)
  • 与此相比,Github文档是废话. (8认同)
  • 对于那些想知道的人来说,“RealPayment”不需要实现接口。 (3认同)
  • 不应在对“付款”的方法调用中传递“日期”和“金额”吗?为什么要将它们注入构造函数中? (2认同)