当前位置: 首页 > 知识库问答 >
问题:

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

张和豫
2023-03-14

我有一个父类,其中包含构造函数注入的依赖项:

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来实现。

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

谢谢!

共有1个答案

胡俊贤
2023-03-14

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

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

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

 类似资料:
  • 所以我正在我的Java项目(Google Guice)中实现一个依赖注入框架,一切都很好,我喜欢它,但是有一个小问题;我想为我的主项目的类创建一个静态实例(实例化依赖项等)。但是我不知道使用Guice实例化它的任何方法,我不能手动实例化它,因为我在它的构造函数中使用DI(我在构造函数中有对象),这意味着我不能访问实例化该类所需的类的非静态变量。我试着使用一个提供者,但是我真的不明白在哪里绑定它,因

  • 问题内容: 编译该程序时,出现错误- 错误-找不到构造函数Person()。为什么定义Person()是必要的? 问题答案: 创建时,您要同时创建一个。为了确保构造正确,编译器在构造函数中添加了一个隐式调用: 由于没有无参数构造函数,因此失败。 您可以通过以下任一方式解决它 添加对super的显式调用,如下所示: } 或通过将no-arg构造函数添加到: } 通常,编译器还会隐式添加无参数构造函数

  • 大家都知道@Autowired(@Inject etc)注释是由AutowiredAnnotationBeanPostProcessor处理的。它解析并设置用@Autowired注释的字段和setter,但构造函数呢?这是bean后处理器,这意味着它是在已经创建bean之后调用的,但是构造函数也可以标记为@Autowired,那么如何创建这样的bean呢?

  • 请帮助理解在哪种情况下我应该使用构造函数注入和设置器注入。请帮我举个合适的例子。 先谢谢你。

  • 我有一个抽象的超类,它有一个形式的构造函数 并希望创建该抽象类的一个子类,该子类不是以字符串作为其第一个参数,而是采用一个表示给定字符串名称的整数值,例如,0代表某个字符串,1代表另一个字符串,依此类推。 当我尝试编写窗体子类(int number,int amount)的构造函数时,我得到一个格式为“Implicit super constructor is undefined.必须显式调用另一

  • 我想在构造函数中使用Request类,这是我想运行服务器时它给我的错误: 无法自动连接服务"AppBundle\Controller\DetectServiceDetailController":方法"__construct()"引用类"Symfony\Component\HttpFoundation\Request"的参数"$ask",但不存在这样的服务。它不能自动注册,因为它来自不同的根命名空