2017-01-16 3 views
1

Ich habe eine App 'app_test', die eine Klasse TestClass mit @ Service-Anotation besteht. Ich habe eine Bibliotheksklasse 'lib_test' mit Bean in einer XML-Datei mit id = '' TestClass '. Beide sind in einem anderen Paket.Injecting 2 Bean mit demselben Klassennamen

I @Service Bohne m Injektion als

Import com.app.TestClass 

    Class TestController 
    { 
    Private final TestClass testClass; 

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

folgt nach Art injizieren sollte, da sie in verschiedenen Paket sind. Aber der Controller gibt eine qualifizierte Bean nicht gefunden.

Ich kann es lösen, indem ich @Qualifier gebe und @Service einen Namen gebe. Aber ist es nötig? Da beide in einem anderen Paket sind, sollte es nach Typ automatisch autowire? Oder fehlt ein Konzept?

+0

Mögliche Duplikate von: http://stackoverflow.com/questions/3925681/spring-autowired-with-2-beans-of-the-same-type – pringi

+1

Nein. Es ist eins mit dem gleichen Paket und anderen Namen. Ich spreche über ein anderes Paket und den gleichen Namen. –

Antwort

1

Obwohl sie in verschiedenen Paketen sind, wenn sie vom gleichen Typ Frühling sind nicht wissen, welche

verwenden Ich würde vorschlagen, jede Dienstklasse mit @Primary Kennzeichnung.

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

diese Weise ist es als Standard-autowire candididate ausgewählt werden, ohne dass auf der anderen Bean autowire-Kandidaten.

Auch anstatt @Autowired @Qualifier zu verwenden, finde ich es eleganter, @Resource für die Auswahl bestimmter Bohnen zu verwenden.

+2

Sie sind nicht der gleiche Typ. Methoden und alles ist anders, nur der Name der Bean ist gleich. Und es gibt kein doppeltes gibt es als Bean nicht gefunden. –

1

Ich habe immer eine seltsame Einschränkung der Spring-Standard-Bean Namenskonvention gefunden. Es enthält nicht den Paketteil der Klasse im Namen, der in großen Projekten zu Duplikaten führt, wenn Klassen den gleichen Namen haben.

Aus diesem Grund habe ich immer Frühling Projekte mit einem anderen BeanNameGenerator konfigurieren:

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

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

und der Generator:

public class QualifiedNameAnnotationBeanNameGenerator extends AnnotationBeanNameGenerator { 

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

Mit diesem Setup gemeinsamen Klassennamen, die automatisch erkannt in verschiedenen Paketen sind als anders und die richtige wird injiziert.

Verwandte Themen