2012-07-04 12 views
8

का कोई अद्वितीय सेम मैं एक सेवा के दो घटक के साथ वसंत में एक छोटे से परेशानी है।स्प्रिंग प्रकार

@Component 
public class SmartCardWrapper 

और यह एक:

मैं इस घटक है

@Component 
public class DummySmartCardWrapper extends SmartCardWrapper 

सेवा autowire दोनों लेकिन वसंत इस 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] 

क्यों यह नहीं है कक्षा के नाम का प्रयोग करें?

+0

हाय Tobia, लगता है कि आप, एनोटेशन @Qualifier का उपयोग करना चाहिए लिंक की जाँच करें: http: //static.springsource। org/वसंत/docs/2.5.x/संदर्भ/beans.html # सेम-एनोटेशन-config – Jaiwo99

उत्तर

6

कि वसंत का सबसे बुनियादी अवधारणाओं में से एक है - नियंत्रण के उलट।

(कार्यान्वयन के साथ युग्मन से बचने के लिए)

आप उनके क्रियान्वयन प्रकार का उपयोग कर अपने निर्भरता की घोषणा करने की जरूरत नहीं है। आप उन्हें इंटरफेस या सुपरक्लास का उपयोग करके घोषित कर सकते हैं, और संदर्भ में उचित कार्यान्वयन कक्षा को स्प्रिंग ढूंढ सकते हैं।

दूसरे शब्दों में, सेम उनके क्रियान्वयन वर्गों द्वारा प्रतिष्ठित नहीं कर रहे हैं, क्योंकि आप सेम है कि यह इस पर निर्भर बदले बिना एक सेम के कार्यान्वयन वर्ग बदलने के लिए कर सकते हैं। आप एक ही प्रकार के विभिन्न सेम के बीच अंतर करना चाहते हैं, तार्किक सेम नाम के बजाय का उपयोग करें:

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

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

मैं @Service सार्वजनिक वर्ग TestProvider साथ कोशिश कर रहा हूँ Runnable लागू करता है, लेकिन जब मैं autowire करने की कोशिश लगता है कि वसंत एक Runnable सेवा के लिए लग रही है। .. क्यूं कर? टेस्टप्रोवाइडर की तलाश कैसे करें? – Tobia

+0

@Tobia: यह [इस समस्या] नहीं है (http://stackoverflow.com/questions/3754296/spring-autowire-not-behaving-as-expected/)? – axtavt

+0

समस्याएं समान प्रतीत होती हैं ... लेकिन मैं समाधान को समझ नहीं पा रहा हूं। मैं बीन को परिभाषित करना चाहता हूं जहां मैंने @ service annotation को अपने सुपरक्लास या इंटरफ़ेस नहीं रखा ... क्या मैं कर सकता हूं? – Tobia