2012-06-08 23 views
5

मैं धीरे-धीरे थोड़ी देर के लिए वसंत के साथ पकड़ने जा रहा हूं और सोचता हूं कि मेरे पास अवधारणाओं का उचित विचार है, हालांकि मुझे अपने अन्य धागे में जानकारी मिली है जो चीजों को उल्टा कर देता है मुझे ...स्प्रिंग प्रोटोटाइप बीन्स और वसंत के लाभ

"... prototype- हालांकि प्रारंभ जीवन चक्र कॉलबैक तरीकों, गुंजाइश की परवाह किए बिना सभी वस्तुओं पर कहा जाता है प्रोटोटाइप के मामले में, कॉन्फ़िगर किया गया विनाश जीवन चक्र कॉलबैक कहा जाता है नहीं कर रहे हैं। क्लाइंट कोड को साफ करना चाहिए स्कॉप्ड ऑब्जेक्ट्स और महंगे संसाधनों को छोड़ दें जो प्रोटोटाइप बीन धारण कर रहे हैं। स्प्रिंग कंटेनर को प्रोटोटाइप-स्कोप्ड बीन्स द्वारा आयोजित संसाधनों को रिहा करने के लिए, कस्टम बीन पोस्ट प्रोसेसर का उपयोग करने का प्रयास करें, जिसमें बीन्स का संदर्भ है साफ करने के लिए ईद। "

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

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

+1

मामले पर आप यह अनुरोध आप उपयोगकर्ता अनुरोध गुंजाइश कर सकते हैं द्वारा स्कोप की जरूरत है;) http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference /html/ch04s04.html –

+0

@Spaeth क्षमा करें मैं भ्रामक हो सकता हूं ... यह एक वेब अनुप्रयोग नहीं है, मैं बस "कुछ" होने के लिए बनाए गए नए उदाहरण की आवश्यकता को प्रदर्शित करने की कोशिश कर रहा था – JLove

उत्तर

13

वसंत साफ होने की आवश्यकता वाले बीन्स के संदर्भ में है (संदर्भ स्वयं का अर्थ है कि बीन कचरा कलेक्टर द्वारा स्वचालित रूप से साफ़ नहीं किया जाएगा)।

हाँ, पर कंटेनर प्रोटोटाइप-दायरे वाले सेम के लिए संदर्भ नहीं रखता है। यही कारण है कि विनाश कॉलबैक को नहीं कहा जाता है: वसंत बीन उदाहरण बनाता है, इसे तार देता है और निर्माण कॉलबैक कहते हैं। यह एक उदाहरण देता है और उस बीन के बारे में भूल जाता है।

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

तो आप प्रोटोटाइप-स्कोप्ड बीन्स को कैसे साफ करते हैं? खैर, जैसे आप जावा में किसी अन्य संसाधन को साफ़ करते हैं - स्पष्ट रूप से। close(), destroy(), stop() या जो भी नाम आपको पसंद है (Closeable को लागू करने पर विचार करें। ध्यान दें कि इस तरह की विधियों की आम तौर पर आवश्यकता नहीं होती है। कचरा कलेक्टर पूरे ऑब्जेक्ट ग्राफ़ को रिलीज़ करेगा, जबकि पूरे DataSource बंद होने पर डेटाबेस कनेक्शन जैसे निरंतर संसाधन बंद हो जाएंगे।

+1

आपके लिए धन्यवाद जवाब ... इस तरह के स्निपेट को पढ़ने से पहले मैंने यह काम किया था, शायद मैंने इसे गलत व्याख्या की है! असल में ... विनाश का निशान छोड़कर, पहले के रूप में आगे बढ़ते हैं, और सबकुछ मेरे पीछे साफ हो जाएगा :-) – JLove

7

आप प्रलेखन पढ़ने में भूलना यह स्पष्ट रूप का कहना है:।

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

तो वसंत में प्रोटोटाइप सेम बनाने के लिए कोई संदर्भ नहीं है। एक बीन पोस्ट प्रोसेसर बनाने के लिए आप पर निर्भर है जो आवश्यक होने पर इन बीन्स के संदर्भ रखेगा।

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

3

स्प्रिंग प्रोटोटाइप स्कोप का उपयोग करके बनाए गए सभी उदाहरणों के बारे में कोई जानकारी नहीं है। यह प्रोटोटाइप स्कॉप्ड बीन्स को तुरंत चालू और कॉन्फ़िगर करेगा और दस्तावेज़ पर टिप्पणी के रूप में इसे क्लाइंट को सौंप देगा।

स्प्रिंग एक प्रोटोटाइप सेम की पूरी जीवन चक्र प्रबंधन नहीं करता है: कंटेनर, को दर्शाता है कॉन्फ़िगर करता है, से सजाया गया है और अन्यथा असेंबल एक प्रोटोटाइप वस्तु, ग्राहक को हाथ और फिर उस प्रोटोटाइप उदाहरण के आगे कोई ज्ञान है ।

http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch04s04.html#beans-factory-scopes-prototype

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