为什么 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
指定一个不同的名称。
我有两个 类:
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
指定一个不同的名称。