2010-01-24 15 views
5

का उपयोग कर ऑन-डिमांड बनाना, मैं कारखाने-आइश पैटर्न में स्टार्टअप के बाद कुछ वसंत बीन्स बनाना चाहता हूं। उदाहरण के लिए हर बार मेरे पास कुछ काम करने के लिए होता है और मुझे एक कार्य बीन (जो शायद अन्य सिंगलटन वसंत सेम पर निर्भर करता है) बनाने की आवश्यकता होती है और इसे निष्पादित करती है।वसंत

समवर्ती रूप से निष्पादित करने के लिए काम के कई टुकड़े हो सकते हैं ताकि प्रत्येक कार्य बीन को स्वतंत्र (प्रोटोटाइप) होना आवश्यक हो।

क्या कोई आम पैटर्न लोग इसे प्राप्त करने के लिए उपयोग करते हैं?

जैसा कि मैंने इसे देखा है, मुझे किसी भी तरह कंटेनर/एप्लिकेशन कॉन्टेक्स्ट के साथ बातचीत करने की आवश्यकता है, लेकिन मैं वास्तव में एप्लिकेशन कॉन्टेक्स्ट/बीन फैक्ट्री के इंजेक्शन स्कैटर नहीं करना चाहता हूं और हर जगह बीन ("...") प्राप्त करने के लिए कॉल करता हूं।

मैं कुछ इस तरह के बारे में सोचा

<bean id="myTask" class="MyTask" scope="prototype"> 
    <property name="entityManager" ref=".../> 
    ... 
</bean> 

<bean id="myTaskExecutor" class="MyTaskExecutor"> 
    <property name="taskFactory"> 
    <xxx:factory bean="myTask"/> 
    </property> 
</bean> 

और फिर कोड

class MyTaskExecutor 
{ 
    private Factory<MyTask> taskFactory; 

    public void setTaskFactory(Factory<MyTask> taskFactory) 
    { 
    this.taskFactory = taskFactory; 
    } 
} 

और शायद एक एनोटेशन (ध्यान दें "फैक्टरी" कुछ मैं कल्पना कर रहा हूँ, के बजाय कुछ है कि मौजूद है) संस्करण

class MyTaskExecutor 
{ 
    @Factory(MyTask.class) 
    private Factory<MyTask> taskFactory; 

} 

शायद पहले से ही कुछ ऐसा है? या मैं कहीं मौलिक कुछ याद कर रहा हूँ।

मुझे एहसास है कि मेरे पास सिंगलटन माईटास्क फैक्ट्री हो सकती है और इसका उपयोग "नया" का उपयोग करने के लिए तत्काल करने के लिए किया जाता है, लेकिन फिर मुझे कारखाने से अपने सभी आश्रितों को पास करना होगा जो गलत लगता है।

तो मैं सवाल को योग करने के लिए लगता है कि

है क्या है आवेदन कोड के भीतर से मांग पर प्रोटोटाइप वसंत सेम बनाने की सिफारिश की तरीका है?

किसी भी इनपुट की सराहना करें।

उत्तर

4

मुझे लगता है कि आप समस्या को अधिक जटिल बना रहे हैं। आपको बस इतना करना है कि TaskFactory कक्षा (इसके बारे में विशेष कुछ नहीं, कोई विशेष इंटरफेस या एनोटेशन नहीं) लिखना है। TaskFactory को अन्य सभी बीन्स की आवश्यकता होगी, और createTask विधि होगी जो मांग पर कार्य करती है, और जो बनाए जाने पर नए कार्य के लिए आवश्यक वसंत बीन्स के संदर्भ पास करती है। क्लाइंट कोड TaskFactory के साथ इंजेक्शन दिया गया है, और आवश्यकता होने पर createTask पर कॉल करता है।

स्प्रिंग स्वयं जो भी करने की कोशिश कर रहा है उसके लिए कोई स्पष्ट समर्थन प्रदान नहीं करता है। factory-method एक्सएमएल विशेषताओं और FactoryBean इंटरफेस की पसंद केवल अपने दायरे के भीतर एक बीन के निर्माण के लिए उपयोगी होती है, और यदि आप उन्हें मांग पर बनाना चाहते हैं, तो इसका मतलब है scope="prototype", और इसका मतलब है getBean() का उपयोग करना।

संपादित करें: शायद यह इंगित करने लायक है कि प्रोटोटाइप-स्कोप्ड बीन्स वास्तव में स्प्रिंग के लिए डिज़ाइन नहीं किए गए हैं। हां, यह उनका समर्थन करता है, लेकिन उनका उपयोग करना एक बहुत ही बढ़िया अनुभव नहीं है। यदि आप वास्तव में इस सड़क पर जाना चाहते हैं, तो यह taking a look at @Configurable के लायक है। रनटाइम क्लासलोडर बाधाओं के कारण यह बहुत शक्तिशाली है, लेकिन हमेशा उपयुक्त नहीं है।

+1

मैं तुम्हें क्या कह रहे हैं मिलता है लेकिन यह अभी भी एक महान समाधान का मन नहीं करता (मैं ऊपर एक कारखाने होने का उल्लेख किया)। इस बात पर विचार करें कि क्या माईटास्क की अन्य प्रोटोटाइप स्कॉप्ड बीन्स पर निर्भरता है, प्रत्येक अपनी निर्भरता के साथ। मुझे या तो फैक्ट्री में उन सभी का निर्माण करना होगा (और अपने आश्रितों को अपने कारखाने में इंजेक्ट करना होगा) और उन्हें माईटास्क के माध्यम से पास करना होगा, या माईटास्क उन्हें बनाना होगा, और फैक्ट्री को अन्य सभी प्रोटोटाइप बीन के आश्रितों में पास करना होगा। सभी एकमात्र के लिए वसंत का उपयोग नहीं के बराबर की तरह लगता है यही कारण है, केवल इस मामले में यह प्रोटोटाइप scoped सेम के लिए है में। –

+0

के बारे में '@ Configurable' – skaffman

0

मैं एक बहुत ही समान काम करने की कोशिश कर रहा हूं (वसंत 3।0) इसके लिए मुझे यह जानने में दिलचस्पी होगी कि आप इस समस्या को हल करने के तरीके को कैसे समाप्त कर चुके हैं।

मेरे वर्तमान दृष्टिकोण getBean() का उपयोग करने के लिए है और मैं अपने वसंत-instatiated सेम/POJOs के साथ डिफ़ॉल्ट सिंगलटन गुंजाइश के साथ चले गए हैं। तो मेरे पास अब के लिए गैर-थ्रेड सुरक्षित कोड है लेकिन ट्रैक को आगे थ्रेड सुरक्षित रखने के लिए इसे बेहतर बनाना चाहते हैं।

+0

मैं सिर्फ प्रासंगिक फलियों पर BeanFactoryAware का उपयोग करने और getBean बुला() के रूप में आवश्यक मेरी प्रोटोटाइप सेम निर्माण करने के लिए समाप्त हो गया संपादित करें देखें। मुझे यकीन है कि एक एनोटेशन समाधान पूरी तरह से व्यवहार्य है लेकिन मैंने फैसला किया कि यह मेरे लिए अधिक होगा क्योंकि मुझे केवल एक बड़े ऐप के लगभग 5-10 स्थानों में कार्यक्षमता की आवश्यकता थी। –