java - Spring /DI : Constructor injection in child class

标签 java spring dependency-injection

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

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 注入(inject),我似乎能够将依赖项保留在父类中,而不需要在子类中重新连接它,如果子类不触及与依赖项相关的功能,这对我来说听起来不错:

class ParentClass {
  private MyService service;

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

class ChildClass extends ParentClass {
  // ...
}

看来,如果我想避免重复 Autowiring 代码和处理子项中的依赖项,我只能使用 setter 或字段注入(inject)来做到这一点。

是否有更清晰的模式来执行此依赖项注入(inject),或者在这种情况下必须使用字段/setter 注入(inject),即使建议使用构造函数注入(inject)?

谢谢!

最佳答案

这不是 Spring 的问题,而是 Java 的问题。尝试删除子类构造函数,看看自己会发生什么——您的代码不应该编译。参见 this回答,之前有介绍过。

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

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

关于java - Spring /DI : Constructor injection in child class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40608850/

相关文章:

java - Go/Java中如何修改http请求中的ip地址

java - 在 Java8 中连接对象数组列表

.net - 许可组件不能很好地与 DI 设计配合使用

typescript - Angular 6 将可注入(inject)数组传递给 app.module.ts 中的提供程序会导致 : "Error in Cannot read property ' length' of undefined"

c# - 在 Windsor CaSTLe 中向组件依赖项添加符号

java - 自动捕获 BlazeDS 远程方法抛出的所有异常?

java - 无法使用 JAXB 解析响应

java - Spring MVC/Spring Data 数据获取递归

java - Spring中如何使用通配符指定回滚?

Spring 3、TransactionManagement、Tomcat 和更改数据源 midflight