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

时间:2016-12-21 09:54:56

标签: java spring spring-annotations spring-bean

我有两节课:

package package1;

@Component
public class MyClass1 {
...

package package2;

@Component
public class MyClass1 {
...

当我运行故障保护(在maven中)时 - 我在春天遇到以下错误(我没有得到确保):

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]

我得到了解决这个问题,我可以得到不同的类名 - 或者我甚至可以指定

@Component(name="MyClass1a")

@Component(name="MyClass1b")

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

(即有三种解决方法很明显 - 但这不是我的问题)。

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

现在对我来说 - 如果他们有相同的包名,他们应该只在春天发生冲突。如果Spring有不同的软件包,那么Spring肯定会给它们不同的缩写名称吗?

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

2 个答案:

答案 0 :(得分:1)

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

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

包名称被剥离,第一个字符是小写的。我所知道的唯一方法是使用value的{​​{1}}或@Componentbeans.xml带注释的配置方法手动命名bean(或者可能实现你自己的@Bean)。

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

BeanNameGenerator

由于bean名称包含句点,因此在按名称自动装配时会出现问题。

答案 1 :(得分:0)

如果没有明确的名称规范,检测到的bean将获得从其类名称派生的默认名称,而不包含包名称,因此将创建两个具有相同名称的bean,这将引发异常。

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