在抽象类中应用@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; }}
@Componentpublic class BasketballService extends BallService { @Autowired public BasketballService(RuleRepository ruleRepository) { super(ruleRepository); }}
4.备忘单
让咱们总结一些要记住的规定。
首先,抽象类不会进行组件扫描,因为没有具体的子类就无奈实例化。
其次,在抽象类中能够进行setter注入,然而如果不对setter办法应用_final_关键字,因此存在肯定误用的危险。如果子类笼罩 setter 办法,则应用程序可能不能失常运行。
第三,因为 Spring 在抽象类中不反对构造函数注入,因而通常应该让具体的子类提供结构函数参数。这意味着咱们须要在具体子类中依赖构造函数注入。
最初,将构造函数注入用于必须的依赖项,并将setter注入用于可选的依赖项是一个很好的教训法令。然而,正如咱们能够从抽象类的一些细微差别中看到的那样,通常在这里构造函数注入更为无利。
因而,实际上咱们能够说具体的子类管制着它的形象父类如何取得其依赖项。 Spring 在拆卸子类时, 会对其依赖进行注入。
5.论断
在本文中,咱们练习了在抽象类中应用_@Autowired_,并解释了一些关键点。
能够在Github我的项目中找到本教程的源代码 。