java-springboot,抽象类中使用@Autowired注入实例为无效

在使用抽象工厂开发模式的时候,公共的可复用的方法,会直接在超类工厂中进行实现,对其他服务类的引用,要么手动实例化,要么建立有参构造器,在springboot框架内,一般是进行自动注入托管。

abstract抽象类不能被实例化,在抽象类中注入服务,而抽象类不能被实例化,因此spring不能实例化抽象类,达到托管的目的。

网上有通过子类注入从而达到超类中依赖服务的目的(有一大堆冗余操作),也有说protect级别,通过懒注册能直接实例化的。(要是有用就不会写这篇博客了),当然可能是使用的框架,依赖包等不一样。

以下实现是基于spring-boot 2.1.3.RELEASE版本

1、抽象类中使用@Autowired托管实例
java-springboot,抽象类中使用@Autowired注入实例为无效_第1张图片
2、抽象类子类java-springboot,抽象类中使用@Autowired注入实例为无效_第2张图片
3、将子类进行注入托管java-springboot,抽象类中使用@Autowired注入实例为无效_第3张图片

  • 在抽象类中@Autowired注入实例,使用的时候实例对象为空,因为抽象类自身无法被实例化,因此无法被spring托管,而抽象类的子类是可以被实例化托管的,当子类被托管后,抽象类中注入的实例对象能正常注入。
    (这里像是java多态向上,向下转型的结果)

经测试以下两种方式注入子类,都能实现抽象超类中注入的实例能正常注入
java-springboot,抽象类中使用@Autowired注入实例为无效_第4张图片
但是以下这种手动实例化子类的操作,是不能达到抽象超类的实例正常注入的效果,因为超类无法被实例化,无法被spring托管,而子类也是手动实例化,并未被spring实例化托管。
java-springboot,抽象类中使用@Autowired注入实例为无效_第5张图片

抽象类不能实例化,因而无法被spring容器托管,抽象类中引用的服务自然也无法被子类进行引用。将子类进行托管,子类不是抽象类,向上转型进行实例化交由spring容器托管,抽象类中引用的服务,这时可以成功进行注入托管,而不是空对象。

使用spring @Autowired注解时。需要注意,当前使用这个注解的类要么是可实例化的,要么子类是可实例化的。并且这个类需要向上被注入引用(服务被调用时进行托管),或者直接注入容器(交由AOC容器托管)。只有在Spring容器中,spring机制才能进行托管,对实例之间的引用进行管理

Interface 接口类中引用托管实例
       JDK8新特性提供default默认实现关键字,默认实现方法类型中需要引用Spring托管的实例对象怎么办,可以在方法入参中进行传递。

以上为个人实践见解,如有误差或者认知不够的地方,烦请指出

你可能感兴趣的:(Spring-boot)