乐趣区

关于java:在抽象类中使用Autowired

在抽象类中应用 @Autowired

1. 简介

在本疾速教程中,咱们将阐明如何在抽象类中应用 @Autowired 主动拆卸注解。

咱们将 @Autowired 利用于 abstract 抽象类,并关注此时要思考的重点。

2.Setter 形式注入

咱们能够在设置办法上应用_@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. 备忘单

让咱们总结一些要记住的规定。

首先,抽象类不会进行组件扫描,因为没有具体的子类就无奈实例化。

其次,在抽象类中能够进行 setter 注入,然而如果不对 setter 办法应用_final_关键字,因此存在肯定误用的危险。如果子类笼罩 setter 办法,则应用程序可能不能失常运行。

第三,因为 Spring 在抽象类中不反对构造函数注入,因而通常应该让具体的子类提供结构函数参数 。这意味着 咱们须要在具体子类中依赖构造函数注入

最初,将构造函数注入用于必须的依赖项,并将 setter 注入用于可选的依赖项是一个很好的教训法令。然而,正如咱们能够从抽象类的一些细微差别中看到的那样,通常在这里 构造函数注入更为无利

因而,实际上咱们能够说 具体的子类管制着它的形象父类如何取得其依赖项。Spring 在拆卸子类时,会对其依赖进行注入。

5. 论断

在本文中,咱们练习了在抽象类中应用_@Autowired_,并解释了一些关键点。

能够在 Github 我的项目中找到本教程的源代码。

退出移动版