为什么 Spring 3 @Component 名称在不同包时会发生冲突?

Why would Spring 3 @Component names clash when they have different packages?

我有两个 类:

package package1;

@Component
public class MyClass1 {
...

package package2;

@Component
public class MyClass1 {
...

当我 运行 故障保护(在 maven 中)时 - 我在 spring 中收到以下错误(我没有得到 surefire):

test1(package3.MyIntegrationTest)  Time elapsed: 6.737 sec  <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by:     org.springframework.context.annotation.ConflictingBeanDefinitionException: 
Annotation-specified bean name 'myClass1' for bean class [packaging1.MyClass1] conflicts 
with existing, non-compatible bean definition of same name and class [package2.MyClass1]

我知道要解决这个问题我可以得到不同的 Class 名称 - 或者我什至可以指定

@Component(name="MyClass1a")

@Component(name="MyClass1b")

或者我什至可以将 package-scan 设置为仅 package1

(即可以通过三种显而易见的方法解决此问题 - 但这不是我的问题)。

这不是我要问的。 (即这不是重复的)。

现在对我来说 - 如果它们具有相同的包名称,它们应该只在 spring 中发生冲突。如果他们有不同的包,Spring 肯定足够聪明,可以给他们不同的简称?

我的问题是:为什么 Spring 3 @Component 名称在不同的包中会发生冲突?

据我所知,spring默认的bean命名方案如下(见the docs for AnnotationBeanNameGenerator

package1.MyClass1 -> myClass1
package2.MyClass1 -> myClass1

包名被剥离,第一个字符小写。我知道的唯一方法是使用 @Component 的可选 value 或通过 beans.xml@Bean 注释配置方法(或可能实现你自己的 BeanNameGenerator).

需要注意的是,内部 classes 将保留其外部 class 的名称作为 bean 名称的一部分,因为使用了 class 短名称,例如:

package1.MyClass1.MyInnerClass -> myClass1.MyInnerClass

由于 bean 名称包含句点,因此在按名称自动装配时可能会导致问题。

如果没有明确的名称规范,检测到的 bean 将获得一个默认名称,该名称派生自其 class 的名称,没有包名称,因此将创建两个具有相同名称的 bean,这将引发异常.

如果您有多个具有相同名称的 class,您应该为每个 @Component 指定一个不同的名称。