1. 简介

在这篇简短的文章中,我们将讨论如何在 抽象类 中使用 @Autowired 注解。

我们会将 @Autowired 应用到抽象类中,并重点说明需要注意的几个关键点。

2. 使用 Setter 注入

我们可以把 @Autowired 注解放在 setter 方法上:

public abstract class BallService {

    private LogRepository logRepository;

    @Autowired
    public final void setLogRepository(LogRepository logRepository) {
        this.logRepository = logRepository;
    }
}

⚠️ 注意:当我们使用 setter 注入时,必须加上 final 关键字,以防止子类重写该方法。否则,*@Autowired* 可能不会按预期工作。

✅ 总结:可以用 setter 注入,但一定要加 final,否则容易踩坑。

3. 构造器注入

不能在抽象类的构造器上使用 @Autowired

Spring 并不会处理抽象类构造器上的 @Autowired 注解。因此,子类需要负责向父类构造器传递所需的依赖参数

正确的做法是在具体子类的构造器上使用 @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);
    }
}

✅ 这样做既符合 Spring 的设计逻辑,又避免了注入失败的风险。

4. 小抄速查表

我们来总结几个要点,方便日后快速查阅:

  1. ❌ 抽象类本身不会被 Spring 组件扫描(component scan)识别,因为它无法被直接实例化。
  2. ✅ 可以在抽象类中使用 setter 注入,但必须加上 final,否则子类覆盖 setter 会导致注入失效。
  3. ⚠️ Spring 不支持在抽象类构造器上使用 @Autowired,所以依赖注入应由具体子类完成。
  4. ✅ 推荐:构造器注入用于必填依赖,setter 注入用于可选依赖。但在涉及抽象类的情况下,构造器注入通常更可靠

📌 核心结论具体子类决定了其抽象父类如何获取依赖。只要 Spring 能正确装配子类,父类中的依赖注入就能正常工作。

5. 结语

本文通过示例演示了在抽象类中使用 @Autowired 的几种方式,并指出了其中的关键注意事项。

一如既往,本教程的源码可以在 GitHub 项目 中找到。


原始标题:Using @Autowired in Abstract Classes

» 下一篇: RxJava Hooks 详解