2012-07-04 20 views
8

In primavera ho un piccolo problema con due componenti di un servizio.Spring Nessun bean univoco di tipo

ho questa componente:

@Component 
public class SmartCardWrapper 

e questo:

@Component 
public class DummySmartCardWrapper extends SmartCardWrapper 

L'autowire servizio sia ma la primavera non riesce a causa questo 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] 

Perché non lo fa usare i nomi delle classi?

+0

Hi Tobia, sembra si dovrebbe usare il @Qualifier annotazione, controllare il link: http: //static.springsource. org/spring/docs/2.5.x/reference/beans.html # beans-annotation-config – Jaiwo99

risposta

6

Questo è uno dei concetti base di Spring - Inversion of Control.

Non è necessario dichiarare le dipendenze utilizzando i relativi tipi di implementazione (per evitare l'accoppiamento con l'implementazione). Puoi dichiararli usando interfacce o superclassi e fare in modo che Spring trovi la corretta classe di implementazione nel contesto.

In altre parole, i bean non sono distinti dalle loro classi di implementazione, perché potresti voler cambiare la classe di implementazione di un bean senza cambiare i bean che dipendono da esso. Se si vuole distinguere tra diversi fagioli dello stesso tipo, utilizzare nomi di fagioli logici invece:

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

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

Sto provando con @Service public TestProvider implementa Runnable ma quando provo a autowire sembra che Spring stia cercando un servizio Runnable. .. perché? Come farlo cercare TestProvider? – Tobia

+0

@Tobia: non è [questo problema] (http://stackoverflow.com/questions/3754296/spring-autowire-not-behaving-as-expected/)? – axtavt

+0

I problemi sembrano essere gli stessi ... ma non riesco a capire la soluzione. Voglio definire il bean dove ho messo l'annotazione @service non la sua superclasse o interfaccia ... posso? – Tobia

Problemi correlati