我有一个 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/