2012-08-02 12 views
16

के कई कार्यान्वयन को संभालने के लिए कहें कि मुझे पर भरोसा करने की आवश्यकता है स्प्रिंग बीन के। मेरे पास एक AccountService इंटरफ़ेस और दो कार्यान्वयन हैं: DefaultAccountServiceImpl और SpecializedAccountServiceImplएक स्प्रिंग बीन/इंटरफ़ेस

  1. वसंत में यह कैसे संभव है (एक या अन्य कार्यान्वयन इंजेक्शन)?

  2. निम्नलिखित इंजेक्शन का उपयोग कौन सा कार्यान्वयन करेगा?

    @Autowired 
    private AccountService accountService; 
    

उत्तर

17

विज्ञापन। 1: के विपरीत @Qualifier annotation या @Resource का उपयोग करके ऑटोवायर का उपयोग कर सकते हैं जो कि टाइप करने के बजाय फ़ील्ड नाम पर डिफ़ॉल्ट है।

विज्ञापन। 2: रनटाइम में यह असफल हो जाएगा कि दो बीन्स इस इंटरफ़ेस को कार्यान्वित कर रहे हैं। यदि आपके सेम में से एक अतिरिक्त annotated with @Primary है, तो इसे टाइप करके ऑटोवॉयरिंग के दौरान प्राथमिकता दी जाएगी।

+0

टॉमसज़: मैं समझता हूं कि मुझे इंजेक्शन होने वाले कार्यान्वयन को निर्दिष्ट करने के लिए '@Qualifier (" special ") 'का उपयोग करने की आवश्यकता है। फिर यदि मैं जावा (xml के बजाए) का उपयोग करके अपनी सेवा को परिभाषित करता हूं तो मैं यह निर्दिष्ट कैसे करूं कि उसके पास कौन सा क्वालीफायर है? क्या यह होगा: 'सेवा (" विशेष ")'? – balteo

+2

@balteo: हाँ। या तो 'सेवा' एनोटेशन में मैन्युअल रूप से सेवा का नाम असाइन करें या पहले अक्षर के साथ सरल श्रेणी का नाम लें, '@Qualifier ("specialAccountServiceImpl") '। –

13
@Autowired 
@Qualifier("impl1") 
BaseInterface impl1; 

@Autowired 
@Qualifier("impl2") 
BaseInterface impl2; 

@Component(value="impl1") 
public class Implementation1 implements BaseInterface { 

} 

@Component(value = "impl2") 
public class Implementation2 implements BaseInterface { 

} 


For full code: https://github.com/rsingla/springautowire/ 
+1

क्या होगा यदि मैं उन सभी स्थानों के लिए कार्यान्वयन स्विच करना चाहता हूं जहां मैं इंटरफ़ेस @Autowire करता हूं? मैं सभी उपयोग स्थानों पर स्पष्ट रूप से निर्दिष्ट नहीं करना चाहता हूं। –

+1

आप @value का उपयोग करके स्प्रिंग एक्सप्रेशन का उपयोग कर सकते हैं और मूल्य को प्रॉपर्टी फ़ाइल (application.properties) में डाल सकते हैं और क्वालिफायर बीन और पीछे स्विच कर सकते हैं। (मैंने इस विशेष मामले में यह कोशिश की है, लेकिन मुझे यकीन है कि यह सिर्फ एक स्ट्रिंग है जो एनोटेशन ले रहा है, इसलिए इसे ठीक काम करना चाहिए। –

+0

अच्छा, मूल्यवान :) समाधान के लिए धन्यवाद –