簡體   English   中英

Guice 構造函數注入或字段注入?

[英]Guice Constructor injection or Field injection?

我是 Guice 的新手。 首選構造函數注入還是首選字段注入?

字段注入看起來既快速又簡單,但由於缺少構造函數,測試將是一個挑戰。

謝謝。

使用構造函數注入

在他們的Minimize mutability wiki 頁面上,Guice 團隊說:

最小化可變性

在可能的情況下,使用構造函數注入來創建不可變對象。 不可變對象簡單、可共享且可以組合。 按照此模式定義可注入類型:

[...]

注入方法和字段

構造函數注入有一些限制:

  • 注入的構造函數可能不是可選的。
  • 除非對象是由 Guice 創建的,否則不能使用它。 這是某些框架的破壞者。
  • 子類必須使用所有依賴項調用super() 這使得構造函數注入變得麻煩,尤其是當注入的基類發生變化時。

當您需要初始化一個不是由 Guice 構造的實例時,方法注入最有用。 AssistedInject 和 Multibinder 等擴展使用方法注入來初始化綁定對象。

字段注入具有最緊湊的語法,因此它經常出現在幻燈片和示例中。 它既不是封裝的,也不是可測試的。 永遠不要注入 final 字段; JVM 不保證注入的值對所有線程都是可見的。

想指出一些差異,以便您自己決定:

  • 通過構造函數注入,您可以使用final修飾符。 不能用場注入做到這一點。 final成員的優勢是題外話,您可以閱讀相關內容。
  • 使用構造函數注入編寫測試用例很容易(就像您已經提到的那樣)
  • 使用構造函數注入,所有依賴項都是強制性的。 為了聲明一個類,您需要知道它所有必需的依賴項。
  • 使用字段注入,您將隱藏類的依賴項,而不是使它們顯式。

以上只是需要思考的幾點。 我個人更喜歡構造函數注入,因為它易於測試和final支持。

這兩種類型都很好。 但是您需要知道何時何地需要使用構造函數注入。

構造函數注入的優點是,

  1. 它提供了不變性(如果使用得當)
In Constructor Injection you can use something like this.

public class MemberResource {

     private final IMemberService memberService;

     @Inject
     public MemberResource(IMemberService memberService) {
         this.memberService = memberService;
     }

}

  1. 單元測試變得更容易。

字段注入的優點是更少的編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM