[英]Guice Constructor injection or Field injection?
我是 Guice 的新手。 首選構造函數注入還是首選字段注入?
字段注入看起來既快速又簡單,但由於缺少構造函數,測試將是一個挑戰。
謝謝。
在他們的Minimize mutability wiki 頁面上,Guice 團隊說:
最小化可變性
在可能的情況下,使用構造函數注入來創建不可變對象。 不可變對象簡單、可共享且可以組合。 按照此模式定義可注入類型:
[...]
注入方法和字段
構造函數注入有一些限制:
- 注入的構造函數可能不是可選的。
- 除非對象是由 Guice 創建的,否則不能使用它。 這是某些框架的破壞者。
- 子類必須使用所有依賴項調用
super()
。 這使得構造函數注入變得麻煩,尤其是當注入的基類發生變化時。當您需要初始化一個不是由 Guice 構造的實例時,方法注入最有用。 AssistedInject 和 Multibinder 等擴展使用方法注入來初始化綁定對象。
字段注入具有最緊湊的語法,因此它經常出現在幻燈片和示例中。 它既不是封裝的,也不是可測試的。 永遠不要注入 final 字段; JVM 不保證注入的值對所有線程都是可見的。
想指出一些差異,以便您自己決定:
final
修飾符。 不能用場注入做到這一點。 final
成員的優勢是題外話,您可以閱讀相關內容。 以上只是需要思考的幾點。 我個人更喜歡構造函數注入,因為它易於測試和final
支持。
這兩種類型都很好。 但是您需要知道何時何地需要使用構造函數注入。
構造函數注入的優點是,
In Constructor Injection you can use something like this.
public class MemberResource {
private final IMemberService memberService;
@Inject
public MemberResource(IMemberService memberService) {
this.memberService = memberService;
}
}
字段注入的優點是更少的編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.