java-springboot,抽象类中使⽤@Autowired注⼊实例为⽆效
在使⽤抽象⼯⼚开发模式的时候,公共的可复⽤的⽅法,会直接在超类⼯⼚中进⾏实现,对其他服务类的引⽤,要么⼿动实例化,要么建⽴有参构造器,在springboot框架内,⼀般是进⾏⾃动注⼊托管。
abstract抽象类不能被实例化,在抽象类中注⼊服务,⽽抽象类不能被实例化,因此spring不能实例化抽象类,达到托管的⽬的。
⽹上有通过⼦类注⼊从⽽达到超类中依赖服务的⽬的(有⼀⼤堆冗余操作),也有说protect级别,通过懒注册能直接实例化的。(要是有⽤就不会写这篇博客了),当然可能是使⽤的框架,依赖包等不⼀样。
以下实现是基于spring-boot 2.1.3.RELEASE版本
1、抽象类中使⽤@Autowired托管实例
2、抽象类⼦类
3、将⼦类进⾏注⼊托管
在抽象类中@Autowired注⼊实例,使⽤的时候实例对象为空,因为抽象类⾃⾝⽆法被实例化,因此⽆法被spring托管,⽽抽象类的⼦类是可以被实例化托管的,当⼦类被托管后,抽象类中注⼊的实例对象能正常注⼊。
(这⾥像是java多态向上,向下转型的结果)
经测试以下两种⽅式注⼊⼦类,都能实现抽象超类中注⼊的实例能正常注⼊
但是以下这种⼿动实例化⼦类的操作,是不能达到抽象超类的实例正常注⼊的效果,因为超类⽆法被实例化,⽆法被spring托管,⽽⼦类也是⼿动实例化,并未被spring实例化托管。
抽象类不能实例化,因⽽⽆法被spring容器托管,抽象类中引⽤的服务⾃然也⽆法被⼦类进⾏引⽤。将⼦类进⾏托管,⼦类不是抽象类,向上转型进⾏实例化交由spring容器托管,抽象类中引⽤的服务,这时可以成功进⾏注⼊托管,⽽不是空对象。
使⽤spring @Autowired注解时。需要注意,当前使⽤这个注解的类要么是可实例化的,要么⼦类是可实例化的。并且这个类需要向上被注⼊引⽤(服务被调⽤时进⾏托管),或者直接注⼊容器(交由AOC容器托管)。只有在Spring容器中,spring机制才能进⾏托管,对实例之间的引⽤进⾏管理
抽象类的使用Interface 接⼝类中引⽤托管实例:
JDK8新特性提供default默认实现关键字,默认实现⽅法类型中需要引⽤Spring托管的实例对象怎么办,可以在⽅法⼊参中进⾏传递。
以上为个⼈实践见解,如有误差或者认知不够的地⽅,烦请指出
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论