2012-07-04 8 views
8

Ich habe ein kleines Problem im Frühjahr mit zwei Komponenten eines Dienstes.Frühling Keine einzigartige Bohne vom Typ

Ich habe diese Komponente:

@Component 
public class SmartCardWrapper 

und diese ein:

@Component 
public class DummySmartCardWrapper extends SmartCardWrapper 

Der Service autowire beide aber der Frühling nicht aufgrund dieses expection:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.cinebot.smartcard.SmartCardWrapper] is defined: expected single matching bean but found 2: [dummySmartCardWrapper, smartCardWrapper] 

Warum es nicht funktioniert Klassennamen verwenden?

+0

Hallo Tobia, scheint man die Anmerkung @Qualifier verwenden sollten, überprüfen Sie den Link: http: //static.springsource. org/spring/docs/2.5.x/reference/beans.html # beans-annotation-config – Jaiwo99

Antwort

6

Das ist eines der grundlegendsten Konzepte von Spring - Inversion of Control.

Sie müssen Ihre Abhängigkeiten nicht über ihre Implementierungstypen deklarieren (um eine Kopplung mit der Implementierung zu vermeiden). Sie können sie stattdessen mithilfe von Interfaces oder Superklassen deklarieren und veranlassen, dass Spring die richtige Implementierungsklasse im Kontext findet.

Mit anderen Worten, Bean wird nicht durch ihre Implementierungsklassen unterschieden, da Sie möglicherweise die Implementierungsklasse einer Bean ändern möchten, ohne die davon abhängigen Beans zu ändern. Wenn Sie zwischen den verschiedenen Bohnen des gleichen Typs unterscheiden wollen, verwenden Sie logische Bohnen Namen statt:

@Autowired @Qualifier("smartCardWrapper") 
private SmartCardWrapper smardCardWrapper; 

@Autowired @Qualifier("dummySmartCardWrapper") 
private SmartCardWrapper dummySmardCardWrapper; 
+0

Ich versuche mit @Service öffentliche Klasse TestProvider implementiert Runnable, aber wenn ich versuche, scheint es, dass der Frühling sucht nach einem ausführbaren Dienst. .. Warum? Wie man es für TestProvider aussehen lässt? – Tobia

+0

@Tobia: Ist es [dieses Problem] (http://stackoverflow.com/questions/3754296/spring-autowire-not-behaving-as-expected/)? – axtavt

+0

Die Probleme scheinen die gleichen zu sein ... aber ich kann die Lösung nicht verstehen. Ich möchte die Bean definieren, wo ich @ Service Annotation putted nicht seine Superklasse oder Schnittstelle ... kann ich? – Tobia