【问题标题】:NoSuchBeanDefinitionException @Autowired - Spring 4.1.6.RELEASENoSuchBeanDefinitionException @Autowired - Spring 4.1.6.RELEASE
【发布时间】: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' 却找不到!!!

标签: spring autowired


【解决方案1】:

Spring 尝试将名为 'xyz' 的 bean 注入 A.b123 。在您的配置中,没有什么可能导致 spring 尝试此操作。 你的代码:

@Component("xyz")
public class B

正在创建一个名为“xyz”的 bean,但不会导致给定的异常。

【讨论】:

  • 根据我的发现,这似乎正在发生。实际情况稍微复杂一些,因为 B 是参数化的 B

    并且需要注入子类型“xyz”。

  • @Prakash 你能添加一个SSCCE 来说明确切的场景吗?此外,如果您更喜欢内联共享源而不是通过 github 或类似服务共享它们,请提供有关 spring(boot?!) 和任何其他所需库版本的详细信息
  • 间歇性地解决这个问题。观察: 1. 不同的 DefaultListableBeanFactory 定位和搜索 bean 'xyz'。 2.如果我有简单的课程,这个问题就无法重现。问题仅存在于泛型类型 3。即使我将未找到的类移动到同一个 jar 中,问题仍然是可重现的。看起来像弹簧通用类型处理的错误。 Java 1.7、Spring 4.1.6、Spring 批处理 3.0.6、Spring 批处理管理 1.3.1
猜你喜欢
  • 2015-08-12
  • 2020-06-09
  • 1970-01-01
  • 2015-01-14
  • 2016-10-15
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多