2011-04-13 10 views
6

मैं एक स्थिति है जहाँ मैं गतिशील रूप से एक कारखाना वस्तु के माध्यम से एक वस्तु बनाने के लिए करना चाहते हैं, लेकिन वस्तु वसंत संदर्भ के माध्यम से बनाने की आवश्यकता है, उदाहरण के कारखाने पद्धति का उपयोग करना निर्भरता autowiring अनुमति देने के लिए। मुझे पता है कि कई अन्य तरीके हैं जिनसे मैं इस समस्या को हल कर सकता हूं - उदाहरण के लिए एक सेवा लोकेटर पैटर्न का उपयोग करना - लेकिन यदि संभव हो तो मैं इसे इस तरह से करना चाहूंगा।प्रोटोटाइप सेम बनाने के लिए गतिशील रूप से

कल्पना कीजिए मैं दो वस्तुओं है:

class OuterObject { 
    List<InnerObjectInterface> innerObjs; 
    ... 
} 
class InnerObject implements InnerObjectInterface{ 
    @Autowired 
    SomeDependency someDependency; 
    ... 
} 

मैं एक कारखाने कि की तर्ज पर कुछ करता है बनाना चाहते हैं:

:

class OuterObjectFactory { 
    private innerObject = new InnerObject(); 

    public OuterObject construct(params){ 
     OuterObject o = new OuterObject(); 
     List<InnerObjectInterface> inners = new ArrayList<InnerObjectInterface>(); 
     ... 
     for(some dynamic condition){ 
      ... 
      inners.add(createInnerObject()); 
      ... 
     } 
    } 
    public createInnerObject(){ 
     return innerObject; 
    } 
} 

मेरे वसंत-context.xml तरह दिखता होगा

<bean id="outerObjectFactory" class="path.OuterObjectFactory" /> 
<bean id="innerObject" class="path.InnerObject" factory-bean="outerObjectFactory" factory-method="createInnerObject" /> 

हालांकि यह काम नहीं करता। केवल एक आंतरिक ऑब्जेक्ट कभी बनाया गया है, जहां मैं इसे कार्य करना चाहता हूं जैसे कि इसका दायरा = "प्रोटोटाइप" है। अगर मैं सेम परिभाषा के दायरे = "प्रोटोटाइप" जोड़ें:

<bean id="innerObject" class="path.InnerObject" factory-bean="outerObjectFactory" factory-method="createInnerObject" scope="prototype"/> 

तो यह कई innerObjects बनाने के लिए लगता है, लेकिन वे सही ढंग से तार नहीं कर रहे हैं। मेरे सहकर्मी का मानना ​​है कि दस्तावेज here पाया गया है कि फैक्ट्री बीन का उपयोग केवल बीन को शुरू करने के लिए किया जाता है, लेकिन मुझे यह स्पष्ट नहीं लगता है।

मैं अगर किसी को यहाँ मेरी समझ स्पष्ट कर सकता है यह बात कि सराहना करेंगे, और संभवतः भी मैं क्या कर रहा हूँ की तुलना में तारों के साथ कारखाने पैटर्न मॉडलिंग के लिए एक बेहतर तरीका सुझाव देते हैं।

धन्यवाद!

उत्तर

2

मुझे लगता है कि तुम क्या कह रहे हैं आप एक कारखाने जो एक सिंगलटन है कि है और आप इसे नई वस्तुओं जिनमें से आप एक नया एक पूर्ण निर्भरता इंजेक्शन के साथ हर बार चाहता हूँ बनाना चाहते हैं। ऐसा करने का पुराना तरीका विधि इंजेक्शन था जिसे आप ऊपर से लिंक करते हैं। नया (और तर्कसंगत क्लीनर तरीका) स्कोप्ड प्रॉक्सी का उपयोग करना है। आप या तो annotations या regular config का उपयोग कर सकते हैं लेकिन विचार यह है कि आप बीन के आसपास प्रॉक्सी बनाते हैं (जैसे इनरऑब्जेक्ट)। जब भी आपको इसके संदर्भ की आवश्यकता हो, वसंत स्वचालित रूप से आपको उचित निर्भरताओं के साथ एक नई प्रति प्रदान करेगा।

+1

यह पता चला है कि यह वास्तव में प्रोटोटाइप सेम के लिए काम नहीं करता है। हालांकि यह मुझे विधि इंजेक्शन के लिए नेतृत्व करता है, जो समस्या को हल करता है - बिल्कुल साफ नहीं, लेकिन अभी भी अच्छी तरह से। धन्यवाद आटा – idbentley