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


106

मान लीजिए कि मेरे पास इन जैसे इंटरफेस हैं:

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

और कॉन्फ़िगरेशन xml का यह स्निपेट:

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

मैं कैसे नियंत्रित कर सकता हूं जो नीचे निर्भरता पर निर्भर है? मुझे यूके पसंद है।

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

मैं स्प्रिंग 3.0.3 का उपयोग कर रहा हूँ। कृपया।


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

जवाबों:


113

यह स्प्रिंग 3.0 मैनुअल के खंड 3.9.3 में प्रलेखित है :

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

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


जब आप "बीन नाम" कहते हैं, तो क्या आपका मतलब उस क्षेत्र के नाम से है जिसमें बीन शामिल होगा? (इस मामले में country)
निधि मोनिका का मुकदमा

67

आप @Qualifier एनोटेशन का उपयोग कर सकते हैं

से यहाँ

क्वालिफ़ायर के साथ फाइन-ट्यूनिंग एनोटेशन-आधारित ऑटोवेयरिंग

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

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

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


12

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

public class Main {
     private Country country;

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

इस मामले में, "#{country}स्ट्रिंग एक स्प्रिंग एक्सप्रेशन लैंग्वेज (स्पेल) की अभिव्यक्ति है जो एक बीन नाम के व्यक्ति का मूल्यांकन करती है country


क्या संपत्ति के आधार पर इंजेक्शन लगाया जा सकता है? क्या होगा यदि USA या UK किसी प्रकार का पैरामीटर URL से आ रहा है और मैं 2 अलग-अलग चीजों को इंजेक्ट करना चाहता हूं जो कि परम है?
कल्पेश सोनी

6

नाम से हल करने के साथ एक और समाधान:

@Resource(name="country")

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


1
लेकिन @Resourcejava 11 के साथ आउट-ऑफ-द-बॉक्स नहीं होंगे joo मॉड्यूल के कारण
डिर्क हॉफमैन

5

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

@Primary
class USA implements Country {}

इस तरह इसे डिफ़ॉल्ट ऑटोवेयर कैंडीडेट के रूप में चुना जाएगा, अन्य सेम पर ऑटोवेयर-उम्मीदवार की कोई आवश्यकता नहीं है।

मो deatils के लिए एक ही इंटरफ़ेस को लागू करने वाले दो सेम को देखते हुए - कैसे ऑटो को डिफ़ॉल्ट बीन सेट करें?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.