我的問題很簡單。哪種方法更有效?
方法一:
@Autowired
private CustomerRepository customerRepo;
方法二:
private final CustomerRepository custormerRepo;
public StudentService(CustomerRepository customerRepo) {
this.customerRepo = customerRepo;
}
正如我所見,method2 中的 DI 是較新的。但我想問你我應該使用哪一個?
uj5u.com熱心網友回復:
TL;DR:方法 2 更加靈活。
方法 1 是場注入的示例,方法 2 是構造注入的示例。
欄位注入具有建構式注入避免的一些缺點。以下是建構式注入的一些優點:
不變性:
你不能這樣做是普通的Java:
@Autowired
private final CustomerRepository customerRepo;
// No constructor that sets "customerRepo".
因此,Spring 提供了建構式注入:
private final CustomerRepository customerRepo;
@Autowired
public StudentService(final CustomerRepository customerRepo) {
this.customerRepo = customerRepo;
}
不變性有時是首選。一個原因是它有助于執行緒安全。
就我個人而言,我遵循這樣的規則,“如果它可以是最終的,它應該是最終的。”
測驗:
您不需要反射來設定依賴項。是的,許多模擬框架會為您處理這個問題,但是通過建構式注入,您可以選擇呼叫new建構式。
討厭NullPointerException的:
一個物件是通過呼叫它的建構式來創建的,對吧?我們通常希望我們的引數在傳入時不為空。通過建構式注入,Spring IoC 容器確保在將建構式中傳遞的所有引數傳遞給建構式之前都可用。
uj5u.com熱心網友回復:
使用建構式注入,Spring也推薦
uj5u.com熱心網友回復:
在您的主代碼中,您應該使用方法 2,因為不建議使用欄位注入(方法 1)。(原因見這里)
在您的測驗代碼中,可以使用方法 1。
uj5u.com熱心網友回復:
除了其他答案所說的關于不變性的內容之外,建構式注入的另一個好處是能夠避免 NPE,即該欄位未初始化。使用自動裝配,從測驗中,您將創建類,然后必須記住設定欄位。使用建構式注入,您不能不初始化該欄位。這在 Kotlin 中更為突出,其中自動裝配的欄位被宣告為lateinit var,如果在初始化之前使用,則會引發運行時例外。但是可以將建構式引數宣告為非空型別,這甚至會阻止您顯式傳遞空值。
uj5u.com熱心網友回復:
我建議你建議更好的東西。通過使用 Lombok 庫@RequiredArgConstructor,您可以避免使用樣板代碼。如果你想知道為什么@Autowired不推薦,因為當你想在你的應用程式中撰寫單元測驗時會出現問題,如果你在哪里使用@Autowired。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/455373.html
上一篇:如果我想傳遞這個json代碼,制作控制器的方法是什么
下一篇:插入新資料時呼叫服務
