java - 使用 Spring,如何将子 bean 注入(inject)父 bean 中?

标签 java spring

我有一个 Bean 想要像这样注入(inject)它的子类:

父级:

package test;

@Component
public class Parent {
  @Autowired
  Child child;

  public Child getChild() {
    return child;
  }
}

child :

package test;

@Component
public class Child extends Parent {
}

这会导致以下错误:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [test.Child] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency

删除extends Parent位会导致一切按预期工作,因此看起来Spring无法找到Child,就好像Parent以某种方式隐藏了它一样。如何配置 Spring 来正确连接这些子实例?我正在使用 Java 类配置,如下所示:

@Configuration
@ComponentScan(basePackages = "test")
public class AppConfig {
}

我尝试使用 @Qualifier 注释并在 AppConfig 中分配不同的名称,如下所示,但这没有帮助:

@Bean(name = "parent")
public Parent parent() {
  return new Parent();
}

@Bean(name = "child")
public Child child() {
  return new Child();
}

我不确定为了让 Spring 将 Child 类视为自己独特的实体,缺少什么成分。这不可能吗?

最佳答案

我通过修改 Parent 的定义解决了这个问题,如下所示:

package test;

@Primary
@Component
public class Parent {
  @Resource
  Child child;

  public Child getChild() {
    return child;
  }
}

并按如下方式修改子项:

package test;

@Component("child")
public class Child extends Parent {
}

我已将 @Autowired 注释替换为 @Resource,它尝试在类型之前按名称进行查找,并向子类添加显式名称。为了在尝试 Autowiring 父级时消除父级与子级的歧义,我还在父级中添加了 @Primary 注释。

我仍然不完全理解为什么按类型查找失败,迫使我使用 @Resource 按名称查找 bean。

关于java - 使用 Spring,如何将子 bean 注入(inject)父 bean 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36409563/

相关文章:

java - 如何从现有代码生成类图和时序图?

java - 将 openCV 与 jsp 一起使用会导致 UnsatisfiedLinkError?

java - 由于 classnotfoundexception : ioexception,Tomcat 无法启动

java - 不使用响应 bean 的 Rest API 消费

java - servlet 的 URL 模式如何对应 Spring MVC 的映射?

java - 为 Spring Locale Interceptor 定义默认语言环境并处理异常

java - Hibernate 始终使用 SaveOrUpdate 安全吗?

java - JPA如何将输入登录字段与数据库中存储的md5进行比较

spring - 禁用某些网址的重定向/错误

java - 如何在Spring应用程序中从数据库加载属性而不是属性文件