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

Ale*_*and 9 java spring dependency-injection

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

class ParentClass {
  private final MyService service;

  @Autowired
  ParentClass(MyService service) {
    this.service=service;
  }
  // ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

使用 setter 注入,我似乎能够将依赖项保留在父类中,并且不需要在子类中重新连接它,如果子类不涉及与依赖项相关联的功能,这对我来说听起来不错:

class ParentClass {
  private MyService service;

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

class ChildClass extends ParentClass {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

似乎如果我想避免重复自动装配代码并处理子项中的依赖项,我只能使用 setter 或字段注入来做到这一点。

是否有更清晰的模式来执行此依赖项注入,或者即使推荐构造函数注入,也必须使用字段/设置器注入的情况?

谢谢!

bor*_*wis 5

这不是 Spring 的问题,而是 Java 的问题。尝试删除子类构造函数,看看自己会发生什么——你的代码不应该编译。看到这个答案,它之前已经描述过。

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

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