如何使用Guice的AssistedInject?


Answers:


168

检查FactoryModuleBuilder类的javadoc 。

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

文档中的示例是 RealPayment

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

可以看到,CreditService并且AuthService应该由容器注入,但是startDate和amount应该由实例创建过程中的开发人员指定。

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

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

8
进行了很多尝试,找不到我的疑问更简洁明了的解释。非常感谢
Gabber 2014年

18
这比Github上的文档更容易理解。做得好。
arjabbar

8
与之相比,Github文档简直就是废话。
EMM 2016年

2
不应在对“付款”的方法调用中传递“日期”和“金额”吗?为什么要将它们注入构造函数中?
Harshit

2
对于那些想知道的人,RealPayment不需要实现接口。
jsallaberry
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.