वसंत: हम इंटरफ़ेस को क्यों लागू करते हैं न कि कार्यान्वित वर्ग को?


142

उदाहरण

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?
  • हम इंटरफ़ेस को क्यों लागू करते हैं और कार्यान्वित वर्ग को नहीं?

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

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

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


1
मुझे लगता है कि केवल एक कार्यान्वयन के लिए एक इंटरफ़ेस बनाना एक मूर्खतापूर्ण अभ्यास है जिसे जावा दुनिया में स्वीकार किया जाता है। परिणाम बहुत सारे कचरा कोड है, लेकिन हर कोई खुश है कि उन्होंने SOLID और OOP के नियमों का पालन किया। इतिहास के डस्टबिन में वसंत का उपयोग करें।
अवगुलुबव

जवाबों:


224

वसंत को कैसे पता चलता है कि किस पॉलीमॉर्फिक का उपयोग करना है।

जब तक इंटरफ़ेस का केवल एक ही कार्यान्वयन है और उस कार्यान्वयन को @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


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

विकदोर - कृपया संपादन देखें। क्या कक्षाओं और इंजेक्शन वाली वस्तु का अनावरण करने का सही तरीका है?
stackoverflow

1
@VictorDombrovsky @Autowired @Qualifier("a1") a;वैध है?
लकी

1
@ लकी मैंने एक गलती की। मेरा मतलब था@Autowired @Qualifier("a1") A a;
विक्टर डोंब्रोवस्की

1
आप कार्यान्वयन को नियंत्रित करने के लिए प्रोग्राम इंटरफ़ेस या एप्लिकेशन प्रॉपर्टीज़ के माध्यम से उस इंटरफ़ेस के लिए इंजेक्ट किए जाने वाले @Profile का उपयोग भी कर सकते हैं।
b15

1

इसके अलावा यह लॉग में कुछ वॉर्निग का कारण हो सकता है जैसे कि Cglib2AopProxy प्रॉक्सी विधि में असमर्थ है । और इसके लिए कई अन्य कारणों का वर्णन यहां किया गया है। हमेशा सेवा और डाओ परतों में एकल कार्यान्वयन इंटरफेस क्यों होता है?

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