java – Spring / DI:子类中的构造函数注入

我有一个带有构造函数注入依赖项的父类:

class ParentClass {
  private final MyService service;

  @Autowired
  ParentClass(MyService service) {
    this.service=service;
  }
  // ...
}

如果我从这个类继承,我是否总是需要重新定义一个调用父构造函数的构造函数?

class ChildClass extends ParentClass {
  // Do I really need this?
  @Autowired
  ChildClass(MyService service) {
    super(service);
  }
  // ...
}

使用setter注入,我似乎能够将依赖项保留在父类中,而不需要在子类中重新连接它,如果子类没有触及链接到依赖项的功能,这对我来说听起来不错:

class ParentClass {
  private MyService service;

  @Autowired
  void setMyService(MyService service) {
    this.service=service;
  }
  // ...
}

class ChildClass extends ParentClass {
  // ...
}

似乎如果我想避免重复自动装配代码并处理子代中的依赖关系,我只能使用setter或field injection来做到这一点.

是否有更清晰的模式来执行此依赖注入,或者这是必须使用field / setter注入的情况,即使建议使用构造函数注入?

谢谢!

最佳答案 它不是Spring问题,而是Java.尝试删除子类构造函数,看看自己会发生什么 – 您的代码不应该编译.见
this答案,之前有人介绍过.

回答关于依赖注入的问题,是的,@ Autowired适用于父类中的setter,但只要你不在子类中覆盖它(试一试).原因是Spring处理对象而不是类,因此当子类被实例化时,Spring不会检查父类中重写方法的注释,除非注释标记为@Inherited(@Autowired不是).

所以,你要么必须为每个子类使用@Autowired(实际上我认为这不是一个大问题),切换到setter注入,用委托替换子类,或者使父类抽象,并且只在子类中使用构造函数注入.

点赞