2016-12-05 88 views
3

我有下面的代码使用Guice做依赖注入。第一个是使用构造函数注入,另一个是在场的正上方添加@Inject。这两种方式有什么区别吗? Guice官方网站上建议使用构造函数注入。通过构造函数注入和通过字段注释注入Guice有什么区别?

class BillingService { 
    private final CreditCardProcessor processor; 
    private final TransactionLog transactionLog; 

    @Inject 
    BillingService(CreditCardProcessor processor, TransactionLog transactionLog) { 
     this.processor = processor; 
     this.transactionLog = transactionLog; 
    } 
    ... 
} 

和:

class BillingService { 
    @Inject 
    private final CreditCardProcessor processor; 
    @Inject 
    private final TransactionLog transactionLog; 
    BillingService() { 

    } 
    ...  
} 

回答

4

我想指出的差异:您将无法使用final修改

  • 没有构造函数注入,即你上面的代码将无法编译。评论最终成员的优势在这里是无关紧要的。
  • 与构造函数注入所有依赖是强制性的。如果不知道每个声明的依赖关系,您将无法实例化该类。使用构造函数注入编写测试用例可能会更容易(请参阅The111的答案)。
  • 还有另一种类型的DI设置器注入 - 它可以更自然地与构造器注入混合(例如用于分离强制性和可选的依赖性)。
4

这里是一个区别。在后一种情况下,注入是您完全构建BillingService实例的唯一方法。如果无论出于何种原因需要在没有注射的情况下制造一个,则不能(至少使用所示的方法)。

在前一种情况下,你仍然可以建立一个老式的方式,如果你有一些理由要做到这一点:

new BillingService(someProcessor, someLog); 

我在一个团队,做了一个这样的工作,另一种是以另一种方式做到的。在大多数情况下,我一直使用注射,即使是为了测试。但是在单元测试中,我偶尔会发现构建非Guicy方法很方便,在这种情况下,构造函数注入确实为您提供了灵活性。