说我有下面的类层次结构:
// Not a component
public class Parent {
}
// See update; this resides in another application context
@Component
public class Child extends Parent {
}
我想使用构造函数注入自动装配Child
bean。
@Component
public class Test {
private final Parent parent;
public Test(@Qualifier("child") Parent parent) {
this.parent = parent;
}
}
但是Spring不允许我这样做,并且抛出一个异常:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.foo.Parent' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=child)}
有没有办法使这项工作成功?
好的,首先,由于我犯了一个错误并且在提出问题之前没有正确分析情况,所以您不可能为这个问题提供答案。
所以发生的事情是,在我的情况下,“子代”驻留在不同的应用程序上下文中,而该上下文恰好是主应用程序上下文中的bean。由于这个原因,原本是标准的Spring实践,对我来说是行不通的。
我将发布答案作为此更新方案的解决方案。
答案 0 :(得分:1)
当您尝试从任何外部库自动装配某些类时,我认为您是在模仿情况。您必须通过xml或java config获取bean。我认为这应该可行,并且您应该从Child中删除组件。
但是无论如何,应该有很大的理由这样做。简单的春季导师接线更加简洁和传统
package com.bssys.ufap.report.springconfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
@Bean
public Parent getChild() {
return new Child();
}
}
答案 1 :(得分:0)
因此,该解决方案仅涉及从其他应用程序上下文中查找bean,如下所示:
@Component
public class Test {
private final Parent parent;
public Test(ApplicationContext applicationContext) {
this.parent = applicationContext.getBean("anotherContext", ApplicationContext.class).getBean("child", Parent.class);
}
}