【发布时间】:2016-03-09 19:06:36
【问题描述】:
我有两个班级 A 和 B。
@Component("abc")
public class A {
@Autowired
private B b123;
}
@Component("xyz")
public class B {
}
在应用程序启动时(在 tomcat 中)我收到以下错误: BeanCreationException:无法自动装配字段:私有 B A.b123;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'xyz' is defined
如果我将 'xyz' 更改为 'b123' ,我仍然会收到相同的错误(用 b123 代替 xyz)
我有点困惑为什么@Autowired 正在寻找@Component 中定义的名称的bean,但仍然没有找到它! 如果我从 B 类中的 @Component 中删除 bean 名称,则 @Autowired 会查找名称为“B”的 bean,即类名!
[类在不同包的不同jar中]
调试spring代码,我发现Spring首先将要注入的beanName计算为'xyz',然后它搜索它没有找到的bean'xyz'并在DefaultListableBeanFactory.java的第687行抛出NoSuchBeanDefinitionException。 这种行为要么是由于 spring 中的错误,要么是应用程序上下文在应用程序中真的搞砸了!
【问题讨论】:
-
尝试使用@Qualifier
-
@Qualifier 在有不明确的 bean 时需要。在这种情况下找不到 bean。
-
Spring 是否配置为在
B所在的包中查找组件? -
@Morfic 是的,spring 正在扫描并选择 B。对于自动装配 b123,spring 会查找 B 类型的 bean,然后将要注入的 bean 的 bean 名称计算为“xyz”,然后搜索bean 命名为 'xyz' 却找不到!!!