2011-04-20 14 views
5

जैसे कार्यान्वयन को गतिशील रूप से इंजेक्ट करने के लिए @Autowired का उपयोग कैसे करें मैं स्प्रिंट के लिए बिल्कुल नया हूं और मेरे आवेदन के लिए वसंत 3.x और roo1.1.1 का उपयोग कर रहा हूं।एक कारखाने पैटर्न

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

public interface SomeInterface { 
    public void doSomething(); 
} 

कार्यान्वयन 1.

public class SomeOb implements SomeInterface { 
    public void doSomething() { 
     //Do something for first implementation here 
    } 
} 

कार्यान्वयन 2.

public class SomeOtherOb implements SomeInterface { 
    public void doSomething() { 
     //Do something for first implementation here 
    } 
} 

अब मेरी सेवा में मैं इस Autowired

@Service 
public class MyService { 

    @Autowired 
    SomeInterface ob; 
    //Rest of the code here 

} 

1) तर्क चयन करने के लिए की तरह की जरूरत है जो कार्यान्वयन के लिए कार्यान्वयन प्रसारित केवल रनटाइम पता है, इसलिए मैं इसे अर्हता प्राप्त करने के लिए @ क्वालिफायर एनोटेशन का उपयोग नहीं कर सकता। 2) मैं की तरह

public class SomeFactoryBean implements FactoryBean<SomeInterface> { 
@Override 
public SomeInterface getObject() throws Exception { 
    if(/*Somecondition*/) { 
     return new SomeOb(); 
    } else 
     return new SomeOtherOb(); 
} 

@Override 
public Class<? extends SomeInterface> getObjectType() { 
    if(/*Somecondition*/) { 
     return SomeOb.class; 
    } else 
     return SomeOtherOb.class; 
} 

@Override 
public boolean isSingleton() { 
    return false; 
} 
} 

applicationContext.xml मैं टैग उल्लेख किया है में एक FactoryBean बनाने की कोशिश की।

मैं की तरह

No unique bean of type [com.xxxx.xxxx.SomeInterface] is defined: expected single matching bean but found 3: [xxxx, xxxxxxx, xxxxFactory] 

एक त्रुटि में चलाने किसी को भी कृपया मुझे इस समस्या को हल करने के लिए मदद कर सकते हैं जब मैं वेबसर्वर चलाते हैं। अगर मैं यह सही नहीं कर रहा हूं तो कृपया मुझे सही तरीके से ऐसा करने के लिए निर्देशित करें।

धन्यवाद और सराहना किसी भी मदद, JJK isSingleton() से

उत्तर

0

वापसी सच है, तो आप केवल अपने आवेदन

की दी गई उदाहरण के लिए सेम से एक कार्यान्वयन की जरूरत है लेकिन मैं अपने डिजाइन सवाल उठाते हैं।

मैं हमेशा इस तरह के कार्यान्वयन को स्विच करने के लिए गुण फ़ाइलों का उपयोग करता हूं। मुझे एक बार साइट के लिए कैप्चा एकीकरण लागू करना पड़ा। हम जे कैप्टाका और रीकाप्चा एपीआई के साथ प्रोटोटाइप कर रहे थे। मैंने एक नया इंटरफ़ेस बनाया जिसमें केवल आवश्यक कार्यक्षमता थी और फिर दोनों एपीआई के लिए कार्यान्वयन बनाए। स्प्रिंग कॉन्फ़िगरेशन फ़ाइल और मेवेन प्रोफाइल में प्लेसहोल्डर्स का उपयोग करके, हम कार्यान्वयन कक्षा को संकलन समय या तैनाती के समय पर स्विच कर सकते हैं, उदाहरण के लिए, एमवीएन जेटटी: run -DcaptchaImpl = recaptcha या -DcaptchaImpl = jcaptcha।

जो कार्य आप पूरा करना चाहते हैं उसे जानने के बिना, अधिक सलाह प्रदान करना मुश्किल है।

3

सुझाव के लिए धन्यवाद। मैं एक सहयोगी से मदद के साथ समस्या को हल करने में सक्षम था। मैं गलत क्या कर रहा था

  1. मैंने @Service के साथ कुछ इंटरफेस का कार्यान्वयन किया था। तो यह वसंत स्कैनर द्वारा उठाया गया था और बीन में जोड़ा गया था।
  2. परीक्षण और त्रुटि के दौरान मैंने फैक्टरीबीन कार्यान्वयन से @ कॉम्पोनेंट एनोटेशन हटा दिया।

इन परिवर्तनों को करने के बाद यह एक आकर्षण की तरह काम करता था।

संबंधित मुद्दे