1. 簡介
本快速教程將介紹如何在抽象類中使用 <em @Autowired</em> 註解。
我們將將 <em @Autowired</em> 應用到抽象類,並重點關注我們在使用時需要考慮的重要事項。
2. 設置器注入 (Setter Injection)
我們可以使用 @Autowired 在設置方法上:
public abstract class BallService {
private LogRepository logRepository;
@Autowired
public final void setLogRepository(LogRepository logRepository) {
this.logRepository = logRepository;
}
}當我們使用 @Autowired 註解在 setter 方法上,應該使用 final 關鍵字,以便子類不能覆蓋 setter 方法。否則,註解將不會按預期工作。
3. 構造函數注入
不能在抽象類的構造函數上使用 @Autowired。
Spring 不會評估抽象類構造函數上的 @Autowired 註解。子類應提供必要的參數給 super 構造函數。
相反,我們應該在子類的構造函數上使用 @Autowired:
public abstract class BallService {
private RuleRepository ruleRepository;
public BallService(RuleRepository ruleRepository) {
this.ruleRepository = ruleRepository;
}
}@Component
public class BasketballService extends BallService {
@Autowired
public BasketballService(RuleRepository ruleRepository) {
super(ruleRepository);
}
}4. 快速參考
最後,我們總結一些需要記住的規則。
首先,抽象類不能被組件掃描,因為它們不能在沒有具體的子類的情況下實例化。
其次,設置注入在抽象類中是可能的,但如果我們不使用 final 關鍵字來為設置方法進行修飾,則風險很高。如果子類覆蓋了設置方法,應用程序可能不穩定。
第三,由於 Spring 不支持在抽象類中構造函數注入,我們通常應該讓具體的子類提供構造函數參數。這意味着我們需要依賴具體的子類中的構造函數注入。
最後,使用構造函數注入來提供必需的依賴項,並使用設置注入來提供可選的依賴項是一個不錯的經驗法則。但是,正如我們從抽象類的一些細微之處所看到的,構造函數注入在這裏通常更可取。
因此,我們可以説一個具體的子類控制其抽象父類如何獲取其依賴項。Spring 會進行注入只要 Spring 能夠將子類連接起來。
5. 結論
在本文中,我們練習了在抽象類中使用 @Autowired,並解釋了一些重要的關鍵點。