知識庫 / Spring RSS 訂閱

使用抽象類中的@Autowired

Spring
HongKong
5
01:26 PM · Dec 06 ,2025

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,並解釋了一些重要的關鍵點。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.