2017-01-16 6 views
1

У меня есть приложение app_test, которое состоит из класса TestClass с анонсом @Service. У меня есть класс библиотеки lib_test с bean-файлом в XML-файле с id = '' TestClass '. Оба находятся в разных пакетах.Injecting 2 bean с таким же именем класса

я м инъекционного @Service боб следующим

Import com.app.TestClass 

    Class TestController 
    { 
    Private final TestClass testClass; 

    @Inject 
    TestController (TestClass testClass) 
    { 
     This.testClass =testClass; 
    } 
    } 

Необходимо вводить по типу, так как они находятся в другом пакете. Но контроллер не дает квалифицированного компонента не найден.

Я могу решить эту проблему, предоставив @Qualifier и давая имя @Service. Но это нужно? Так как оба находятся в разных пакетах, он должен автоматически авторизовать по типу? Или m не хватает какой-то концепции?

+0

Возможный дубликат: http://stackoverflow.com/questions/3925681/spring-autowired-with-2-beans-of-the-same-type – pringi

+1

Нет. Это один и тот же пакет и другое имя. M говорит о разных пакетах и ​​том же имени. –

ответ

1

Хотя они находятся в разных пакетах, если они одного и того же типа Spring не знает, какой из них использовать

Я хотел бы предложить для разметки любого класса обслуживания с @Primary.

package com.app.TestClass 
@Primary 
@Repository 
public class TestClass implements XXX 

Таким образом, он будет выбран в качестве autowire по умолчанию candididate в, без необходимости autowire-кандидата на другой компонент.

Кроме того, вместо использования @Autowired @Qualifier, я нахожу более изящным использовать @Resource для выбора конкретных компонентов.

+2

Они не одного типа. Методы и все разные, только имя компонента одинаково. И он не дает дубликатов, которые он дает, поскольку bean не найден. –

1

Я всегда считал это странным ограничением стандартного соглашения об именах компонентов Spring. Он не включает пакетную часть класса в имени, которая приводит к дублированию в больших проектах, когда классы имеют одинаковое имя.

Вот почему я всегда настроить Spring проектов с различными BeanNameGenerator:

public class CustomAnnotationConfigWebApplicationContext extends AnnotationConfigWebApplicationContext { 
    private BeanNameGenerator qualifiedAnnotationBeanNameGenerator = new QualifiedNameAnnotationBeanNameGenerator(); 

    @Override 
    protected BeanNameGenerator getBeanNameGenerator() { 
     return this.qualifiedAnnotationBeanNameGenerator; 
    } 
} 

и генератор:

public class QualifiedNameAnnotationBeanNameGenerator extends AnnotationBeanNameGenerator { 

    @Override 
    protected String buildDefaultBeanName(BeanDefinition definition) { 
     String qualifiedName = definition.getBeanClassName(); 
     return Introspector.decapitalize(qualifiedName); 
    } 
} 

С помощью этой установки, общие имена классов, которые находятся в разных пакетах автоматически распознаются как разные, и правильные инъекции.

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

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