在抽象类中应用 @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 我的项目中找到本教程的源代码。