2012-10-15 11 views
85

उदाहरणवसंत: हम इंटरफ़ेस को स्वचालित क्यों करते हैं, न कि कार्यान्वित कक्षा?

interface IA 
{ 
    public void someFunction(); 
} 

@Resource(name="b") 
class B implements IA 
{ 
    public void someFunction() 
    { 
    //busy code block 
    } 
    public void someBfunc() 
    { 
    //doing b things 
    } 
} 

@Resource(name="c") 
class C implements IA 
{ 
    public void someFunction() 
    { 
    //busy code block 
    } 
    public void someCfunc() 
    { 
    //doing C things 
    } 
} 

class MyRunner 
{ 

    @Autowire 
    @Qualifier("b") 
    IA worker; 

    worker.someFunction(); 
} 

किसी ने मुझे इस व्याख्या कर सकते हैं।

  • वसंत कैसे पता चलता है कि कौन से बहुरूप प्रकार का उपयोग करना है।
  • क्या मुझे @Qualifier या @Resource की आवश्यकता है?
  • हम इंटरफ़ेस को स्वचालित क्यों करते हैं, न कि कार्यान्वित कक्षा?
+7

आप इंटरफ़ेस को स्वचालित करते हैं ताकि आप एक * अलग * कार्यान्वयन में तार कर सकें - यह कक्षा में नहीं, इंटरफ़ेस को कोडिंग के बिंदुओं में से एक है। –

+0

आप एक अलग कार्यान्वयन में तार करेंगे; मैं सवाल समझ में नहीं आता। –

+0

यदि हम इंटरफ़ेस में वायरिंग कर रहे हैं, तो क्या होता है जब आईएमएल कक्षा के भीतर एक डिफ़ॉल्ट दृश्यता विधि है जिसे मुझे एक्सेस की आवश्यकता है? मैं उस विधि को इंटरफ़ेस में नहीं जोड़ सकता क्योंकि सार्वजनिक इंटरफ़ेस में डिफ़ॉल्ट संशोधक नहीं हो सकता है। – JLewkovich

उत्तर

140

वसंत कैसे पता चलता है कि किस बहुलक प्रकार का उपयोग करना है।

जब तक वहाँ केवल इंटरफेस की एक एकल कार्यान्वयन है और है कि कार्यान्वयन वसंत के घटक स्कैन सक्षम, स्प्रिंग फ्रेमवर्क (इंटरफेस, कार्यान्वयन) जोड़ी पता कर सकते हैं के साथ @Component साथ टिप्पणी की जाती है के रूप में। यदि घटक स्कैन सक्षम नहीं है, तो आपको बीन को अपने एप्लिकेशन-config.xml (या समतुल्य वसंत कॉन्फ़िगरेशन फ़ाइल) में स्पष्ट रूप से परिभाषित करना होगा।

क्या मुझे @Qualifier या @Resource की आवश्यकता है?

एक बार जब आप एक से अधिक कार्यान्वयन है, तो आप उनमें से और स्वत: तारों के दौरान प्रत्येक अर्हता प्राप्त करने की जरूरत है, तो आप सही कार्यान्वयन सुई, @Autowired एनोटेशन के साथ @Qualifier एनोटेशन का उपयोग करने की आवश्यकता होगी। यदि आप @Resource (J2EE semantics) का उपयोग कर रहे हैं, तो आपको इस एनोटेशन के name विशेषता का उपयोग करके बीन नाम निर्दिष्ट करना चाहिए।

हम इंटरफ़ेस को स्वचालित क्यों करते हैं, न कि कार्यान्वित कक्षा?

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

interface IA 
{ 
    public void someFunction(); 
} 


class B implements IA 
{ 
    public void someFunction() 
    { 
    //busy code block 
    } 
    public void someBfunc() 
    { 
    //doing b things 
    } 
} 


class C implements IA 
{ 
    public void someFunction() 
    { 
    //busy code block 
    } 
    public void someCfunc() 
    { 
    //doing C things 
    } 
} 

class MyRunner 
{ 
    @Autowire 
    @Qualifier("b") 
    IA worker; 

    .... 
    worker.someFunction(); 
} 

आपका सेम विन्यास इस तरह दिखना चाहिए:

<bean id="b" class="B" /> 
<bean id="c" class="C" /> 
<bean id="runner" class="MyRunner" /> 

वैकल्पिक रूप से, अगर आप पैकेज जहां इन मौजूद हैं पर घटक स्कैन सक्षम है, तो आप प्रत्येक वर्ग @Component साथ अर्हता प्राप्त करना चाहिए इस प्रकार है:

interface IA 
{ 
    public void someFunction(); 
} 

@Component(value="b") 
class B implements IA 
{ 
    public void someFunction() 
    { 
    //busy code block 
    } 
    public void someBfunc() 
    { 
    //doing b things 
    } 
} 


@Component(value="c") 
class C implements IA 
{ 
    public void someFunction() 
    { 
    //busy code block 
    } 
    public void someCfunc() 
    { 
    //doing C things 
    } 
} 

@Component  
class MyRunner 
{ 
    @Autowire 
    @Qualifier("b") 
    IA worker; 

    .... 
    worker.someFunction(); 
} 

workerMyRunnerB के उदाहरण के साथ इंजेक्शन दिया जाएगा।

+0

@stackoverflow प्रश्न संपादित करने से कोई अर्थ नहीं होगा, नया कोड उत्तर में संबंधित है। अन्यथा सवाल का कोई मतलब नहीं है, क्योंकि यह स्वयं उत्तर दिया होगा। –

+0

विक्टर - कृपया संपादित करें देखें। क्या कक्षाओं और इंजेक्शन ऑब्जेक्ट को एनोटेट करने का सही तरीका है? – stackoverflow

+1

कृपया मेरा अपडेट देखें। – Vikdor