我有两节课:
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名称在有不同的包时会发生冲突?
答案 0 :(得分:1)
据我所知,spring的bean默认命名方案如下(见the docs for AnnotationBeanNameGenerator)
package1.MyClass1 -> myClass1
package2.MyClass1 -> myClass1
包名称被剥离,第一个字符是小写的。我所知道的唯一方法是使用value
的{{1}}或@Component
或beans.xml
带注释的配置方法手动命名bean(或者可能实现你自己的@Bean
)。
需要注意的是,内部类将保留其外部类的名称作为bean名称的一部分,因为使用了类的短名称,例如:
BeanNameGenerator
由于bean名称包含句点,因此在按名称自动装配时会出现问题。
答案 1 :(得分:0)
如果没有明确的名称规范,检测到的bean将获得从其类名称派生的默认名称,而不包含包名称,因此将创建两个具有相同名称的bean,这将引发异常。
如果您有多个具有相同名称的类,则应为每个@Component
指定一个不同的名称。