वसंत को कैसे पता चलता है कि किस पॉलीमॉर्फिक का उपयोग करना है।
जब तक इंटरफ़ेस का केवल एक ही कार्यान्वयन है और उस कार्यान्वयन को @Component
स्प्रिंग के घटक स्कैन सक्षम के साथ एनोटेट किया जाता है, तब तक स्प्रिंग फ्रेमवर्क (इंटरफ़ेस, कार्यान्वयन) जोड़ी का पता लगा सकता है। यदि घटक स्कैन सक्षम नहीं है, तो आपको अपने एप्लिकेशन- config.xml (या समतुल्य स्प्रिंग कॉन्फ़िगरेशन फ़ाइल) में बीन को स्पष्ट रूप से परिभाषित करना होगा।
क्या मुझे @Qualifier या @Resource की आवश्यकता है?
एक बार जब आपके पास एक से अधिक कार्यान्वयन हैं, तो आपको उनमें से प्रत्येक को अर्हता प्राप्त करने की आवश्यकता है और ऑटो-वायरिंग के दौरान, @Qualifier
एनोटेशन के साथ-साथ आपको सही कार्यान्वयन को इंजेक्ट करने के लिए एनोटेशन का उपयोग करने की आवश्यकता होगी @Autowired
। यदि आप @Resource (J2EE शब्दार्थ) का उपयोग कर रहे हैं, तो आपको 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();
}
फिर प्रकार के उदाहरण के साथ इंजेक्ट worker
किया MyRunner
जाएगा B
।