【问题标题】:Why does Spring throw a ConflictingBeanDefinitionException for beans of different packages and even package-private beans?为什么 Spring 会为不同包的 bean 甚至包私有 bean 抛出 ConflictingBeanDefinitionException?
【发布时间】:2022-12-21 03:12:35
【问题描述】:

我知道,不能有两个同名的不同类的 bean——至少在理论上是这样,但我想知道,为什么不考虑类的包?

例如:

两个完全独立的类,没有公共接口。

com.company.application.foo.Bar

与 DI 框架相同

com.company.application.bar.Bar

但是如果您尝试将一个分配给另一个,编译器当然会看到差异并抱怨。

更令人困惑的是,如果两个 bean 都是包私有的——没有私有/公共修饰符,只在它们的包中可见,为什么会出现冲突?

根据定义,无处不存在冲突,但 Spring 发现了一个问题并且没有任何区别并产生:

org.springframework.context.annotation.ConflictingBeanDefinitionException:bean 类 [com.company.bar.Bar] 的注释指定的 bean 名称“myComponent”与同名和类 [com.company.foo] 的现有不兼容 bean 定义冲突。酒吧]

为什么决定只查看 bean 的名称,而不是完整的包路径和名称?

【问题讨论】:

    标签: java spring spring-boot dependency-injection


    【解决方案1】:

    如果您没有明确指定名称,Spring 会从简单的类名(即没有包名)派生出 bean 的默认名称。这些名称存储在单个名称空间(每个上下文)中,因此从两个具有相同简单名称的类定义的 bean 将导致名称冲突。如果您想避免名称冲突,则必须明确命名您的 bean(例如 @Component("distinctNameForThisBean"))。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 2014-06-23
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 2017-01-01
      相关资源
      最近更新 更多