2016-12-05 62 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方法很方便,在這種情況下,構造函數注入確實爲您提供了靈活性。