2016-12-21 5 views
2

У меня есть два класса:Почему столкновение Spring 3 @Component сталкивается, когда у них разные пакеты?

package package1; 

@Component 
public class MyClass1 { 
... 

package package2; 

@Component 
public class MyClass1 { 
... 

Когда я бег отказоустойчивых (в мавена) - я получаю следующую ошибку весной (что я не получаю в безошибочном):

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 3 @Component имена сталкиваются, когда у них разные пакеты?

ответ

1

Насколько я знаю, по умолчанию схема именования весны для бобов следующим образом (см the docs for AnnotationBeanNameGenerator)

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

Имя пакета раздели, а первый символ в нижнем регистре. Единственным способом, который я знаю об этом, было бы назвать бины вручную, используя опцию value@Component или через beans.xml или метод аннотированной конфигурации @Bean (или, возможно, реализовать свой собственный BeanNameGenerator).

Что-то отметить, внутренние классы сохранят имя своего внешнего класса как часть имени боба, так как класс короткое_имя используются, например:

package1.MyClass1.MyInnerClass -> myClass1.MyInnerClass 

Это может вызвать проблемы при автоматическом связывании по имени, так как фасоль имя содержит период.

0

Без явной спецификации имени обнаруженный компонент получит имя по умолчанию, полученное от имени своего класса, без имени пакета, поэтому будут созданы две компоненты с тем же именем, которые будут генерировать исключение.

Если у вас есть несколько классов с одинаковым именем, вы должны указать другое имя для каждого @Component.

 Смежные вопросы

  • Нет связанных вопросов^_^