2010-12-15 11 views
77

मान लीजिए मैं इस तरह के इंटरफेस है:स्प्रिंग ऑटोवायर नाम से कैसे होता है जब एक से अधिक मिलान बीन मिलते हैं?

interface Country {} 
class USA implements Country {} 
class UK implements Country() 

और विन्यास एक्सएमएल के इस स्निपेट:

<bean class="USA"/> 
<bean id="country" class="UK"/> 
<bean id="main" class="Main"/> 

मैं कैसे नियंत्रित कर सकते हैं जो निर्भरता नीचे autowired है? मुझे ब्रिटेन एक चाहिए।

class Main { 
    private Country country; 
    @Autowired 
    public void setCountry(Country country) { 
     this.country = country; 
    } 
} 

मैं वसंत 3.0.3.RELEASE का उपयोग कर रहा हूं।

+0

सोचा था कि मैं जोड़ूंगा कि मुझे "कोई अद्वितीय बीन प्रकार नहीं मिल रहा था ..."एक (परीक्षण) पर्यावरण में और यह मेरे विकास पर्यावरण में ठीक काम करता है। मुझे यकीन है कि यह किसी प्रकार की क्लासपाथ चीज थी, लेकिन अगर आप @ क्वालिफायर जोड़ते हैं, तो यह ठीक काम करता है। – markthegrea

उत्तर

87

यह वसंत 3.0 मैनुअल की section 3.9.3 में दर्ज है:

फ़ॉलबैक मैच के लिए, सेम नाम एक डिफ़ॉल्ट क्वालीफायर मूल्य माना जाता है।

दूसरे शब्दों में, डिफ़ॉल्ट व्यवहार ऐसा लगता है कि आप सेटर विधि में @Qualifier("country") जोड़ देंगे।

49

आप @Qualifier एनोटेशन

here

ठीक ट्यूनिंग एनोटेशन आधारित autowiring से क्वालिफायर

साथ प्रकार से autowiring के बाद से, उपयोग कर सकते हैं एक से अधिक सुझावों को जन्म दे सकती यह अक्सर होना आवश्यक है चयन प्रक्रिया पर अधिक नियंत्रण। इसे पूरा करने का एक तरीका स्प्रिंग की @ क्वालीफायर एनोटेशन के साथ है। यह विशिष्ट तर्कों के साथ क्वालीफायर मानों को जोड़ने के लिए अनुमति देता है, प्रकार मिलानों के सेट को संकुचित करता है ताकि प्रत्येक तर्क के लिए एक विशिष्ट बीन चुना जा सके। सामान्य स्थिति में, यह एक सादे वर्णनात्मक मान हो सकता है:

class Main { 
    private Country country; 
    @Autowired 
    @Qualifier("country") 
    public void setCountry(Country country) { 
     this.country = country; 
    } 
} 

यह ब्रिटेन संयुक्त राज्य अमेरिका की फलियों को एक आईडी जोड़ सकते हैं और उपयोग करें कि आप संयुक्त राज्य अमेरिका चाहते हैं का प्रयोग करेंगे।

8

एक ही परिणाम प्राप्त करने का एक और तरीका है @value एनोटेशन उपयोग करने के लिए है:

public class Main { 
    private Country country; 

    @Autowired 
    public void setCountry(@Value("#{country}") Country country) { 
      this.country = country; 
    } 
} 

इस मामले में, "#{country} स्ट्रिंग एक Spring Expression Language (SpEL) अभिव्यक्ति जो country नाम के एक सेम का आकलन करती है।

+0

संपत्ति पर आधारित इंजेक्शन किया जा सकता है क्या होगा अगर यू.एस. या यूके यूआरएल से कुछ प्रकार का पैरामीटर आ रहा है और मैं परम के आधार पर 2 अलग-अलग चीजों को इंजेक्ट करना चाहता हूं? –

2

कुछ मामलों में आप एनोटेशन @ प्रिमिरी का उपयोग कर सकते हैं।

@Primary 
class USA implements Country {} 

इस तरह यह, डिफ़ॉल्ट autowire candididate के रूप में चयन किया जाएगा कोई autowire उम्मीदवार की जरूरत अन्य सेम पर साथ।

मो के विवरण के लिए नाम से समाधान करने में Autowiring two beans implementing same interface - how to set default bean to autowire?

5

एक और समाधान को देखो:

@Resource(name="country") 

यह javax.annotation पैकेज का उपयोग करता है, तो यह विशिष्ट वसंत नहीं है, लेकिन वसंत यह समर्थन करता है।

संबंधित मुद्दे