जब मैंने पहली बार स्प्रिंग के साथ काम करना शुरू किया, तो जिस अवधारणा ने मुझे सबसे ज्यादा आकर्षित किया, वह बीन स्कोप्स का विचार था। स्प्रिंग विभिन्न बीन स्कोप प्रदान करता है जो स्प्रिंग कंटेनर के भीतर बनाए गए बीन्स के जीवनचक्र को निर्धारित करता है। सबसे अधिक उपयोग किए जाने वाले दो स्कोप सिंगलटन और प्रोटोटाइप हैं। कुशल और प्रभावी स्प्रिंग अनुप्रयोगों को डिजाइन करने के लिए इन क्षेत्रों को समझना महत्वपूर्ण है, इसलिए मैंने उनके बारे में जो सीखा है, उसके बारे में आपको बताता हूं।
स्प्रिंग में, एक बीन एक ऑब्जेक्ट है जिसे स्प्रिंग आईओसी (कंट्रोल का उलटा) कंटेनर द्वारा तत्काल, इकट्ठा और प्रबंधित किया जाता है। बीन स्कोप बीन के जीवनचक्र को संदर्भित करता है - बीन इंस्टेंस कैसे और कब बनाए जाते हैं, और वे कितने समय तक चलते हैं।
स्प्रिंग कई बीन स्कोप प्रदान करता है, लेकिन मैं जिन दो पर ध्यान केंद्रित करूंगा वे हैं:
प्रत्येक दायरे के अपने विशिष्ट उपयोग के मामले होते हैं, और सही को चुनने से आपके एप्लिकेशन के व्यवहार और प्रदर्शन पर महत्वपूर्ण प्रभाव पड़ सकता है।
सिंगलटन स्कोप स्प्रिंग में डिफ़ॉल्ट स्कोप है, और यह वह है जिसका मैं सबसे अधिक बार उपयोग करता हूं। जब एक बीन को सिंगलटन स्कोप के साथ परिभाषित किया जाता है, तो इसका मतलब है कि स्प्रिंग कंटेनर उस बीन का केवल एक उदाहरण बनाएगा, और यह एकल उदाहरण पूरे एप्लिकेशन संदर्भ में साझा किया जाएगा।
जब मैं एक बीन को सिंगलटन के रूप में घोषित करता हूं, तो स्प्रिंग पहली बार अनुरोध किए जाने पर बीन इंस्टेंस बनाता है, या तो एप्लिकेशन संदर्भ के स्टार्टअप के दौरान या जब इसे पहली बार संदर्भित किया जाता है। उसके बाद, इस बीन के लिए प्रत्येक आगामी अनुरोध वही उदाहरण लौटाएगा।
यहां एक सरल उदाहरण दिया गया है:
@Configuration public class AppConfig { @Bean public MyService myService() { return new MyService(); } }
इस उदाहरण में, myService() एक सिंगलटन बीन है। जब भी मैं स्प्रिंग संदर्भ से MyService बीन का अनुरोध करता हूं, मुझे वही उदाहरण मिलेगा।
मैंने पाया है कि सिंगलटन स्कोप स्टेटलेस बीन्स के लिए आदर्श है - जिनमें कोई ग्राहक-विशिष्ट जानकारी नहीं होती है। उदाहरणों में शामिल हैं:
सिंगलटन बीन्स का प्रमुख लाभ स्मृति दक्षता है। एकल उदाहरण का पुन: उपयोग करने से, एप्लिकेशन कम मेमोरी की खपत करता है और ऑब्जेक्ट बनाने और नष्ट करने का ओवरहेड कम हो जाता है। हालाँकि, सिंगलटन बीन्स से सावधान रहना महत्वपूर्ण है जो स्थिति बनाए रखते हैं। यदि एक सिंगलटन बीन अनजाने में राज्य (उदाहरण के लिए, उदाहरण चर) रखता है, तो इस राज्य को कई ग्राहकों में साझा किया जा सकता है, जिससे संभावित डेटा विसंगतियां हो सकती हैं।
सिंगलटन के विपरीत, प्रोटोटाइप स्कोप हर बार स्प्रिंग कंटेनर से बीन का अनुरोध करने पर एक नया बीन इंस्टेंस बनाता है। जब मुझे इसके बारे में पता चला, तो यह स्पष्ट हो गया कि प्रोटोटाइप बीन्स उन परिदृश्यों के लिए उपयोगी हैं जहां मुझे प्रत्येक उपयोग के लिए एक ताजा उदाहरण की आवश्यकता होती है।
जब एक बीन को प्रोटोटाइप स्कोप के साथ परिभाषित किया जाता है, तो स्प्रिंग हर बार बीन के अनुरोध पर एक नया उदाहरण लौटाएगा। यहां बताया गया है कि मैं प्रोटोटाइप बीन को कैसे परिभाषित कर सकता हूं:
@Configuration public class AppConfig { @Bean @Scope("prototype") public MyService myService() { return new MyService(); } }
इस उदाहरण में, जब भी मैं स्प्रिंग संदर्भ से MyService बीन का अनुरोध करता हूं, स्प्रिंग MyService का एक नया उदाहरण बनाएगा।
स्टेटफुल बीन्स से निपटने के दौरान प्रोटोटाइप बीन्स विशेष रूप से उपयोगी होते हैं - वे जो किसी प्रकार की क्लाइंट-विशिष्ट स्थिति बनाए रखते हैं या प्रत्येक उपयोग के लिए अद्वितीय कॉन्फ़िगरेशन की आवश्यकता होती है। कुछ विशिष्ट उपयोग के मामलों में शामिल हैं:
प्रोटोटाइप बीन्स का उपयोग करने का प्राथमिक लाभ यह है कि यह नए उदाहरण बनाने में लचीलापन प्रदान करता है। स्टेटफुल ऑब्जेक्ट्स से निपटते समय यह विशेष रूप से उपयोगी होता है। हालाँकि, प्रदर्शन और संसाधन उपयोग के मामले में एक समझौता है। चूंकि हर बार एक नया उदाहरण बनाया जाता है, इससे मेमोरी की खपत अधिक हो सकती है और अधिक बार कचरा संग्रहण हो सकता है। इसके अलावा, सिंगलटन बीन्स के विपरीत, स्प्रिंग निर्माण से परे प्रोटोटाइप बीन्स के जीवनचक्र का प्रबंधन नहीं करता है, इसलिए मुझे इन बीन्स के विनाश और सफाई को मैन्युअल रूप से संभालना होगा।
स्प्रिंग एप्लिकेशन को डिज़ाइन करते समय मेरे सामने आने वाले प्रमुख निर्णयों में से एक सिंगलटन और प्रोटोटाइप स्कोप के बीच चयन करना है। यहां उन कारकों का सारांश दिया गया है जिन पर मैं विचार करता हूं:
मैं एक व्यावहारिक परिदृश्य प्रदान करता हूं जो यह स्पष्ट करने में मदद कर सकता है कि प्रत्येक दायरे का उपयोग कब करना है। मान लीजिए मैं एक ऑनलाइन शॉपिंग एप्लिकेशन बना रहा हूं।
एक बात जो मैंने कठिन तरीके से सीखी है वह यह है कि सिंगलटन और प्रोटोटाइप बीन्स को मिलाने से अप्रत्याशित समस्याएं पैदा हो सकती हैं। उदाहरण के लिए, एक प्रोटोटाइप-स्कोप्ड बीन को सिंगलटन बीन में इंजेक्ट करने से सिंगलटन बीन हमेशा प्रोटोटाइप बीन के एक ही उदाहरण का उपयोग कर सकता है। इससे बचने के लिए, मैं आमतौर पर एक प्रदाता को इंजेक्ट करता हूं या @लुकअप एनोटेशन का उपयोग करता हूं ताकि यह सुनिश्चित किया जा सके कि हर बार जरूरत पड़ने पर प्रोटोटाइप बीन का एक नया उदाहरण बनाया जाए।
@Service public class SingletonService { @Autowired private ProvidermyPrototypeServiceProvider; public void usePrototypeService() { MyPrototypeService prototypeService = myPrototypeServiceProvider.get(); prototypeService.execute(); } }
इस उदाहरण में, myPrototypeServiceProvider.get() यह सुनिश्चित करता है कि MyPrototypeService का एक नया उदाहरण हर बार सिंगलटन बीन के भीतर कॉल किए जाने पर बनाया जाता है।
स्प्रिंग में सिंगलटन और प्रोटोटाइप बीन स्कोप की बारीकियों को समझना एक डेवलपर के रूप में मेरी यात्रा में महत्वपूर्ण रहा है। दोनों स्कोप उपयोग के मामले के आधार पर अलग-अलग लाभ प्रदान करते हैं, और सही को चुनने से किसी एप्लिकेशन के प्रदर्शन और डिज़ाइन पर महत्वपूर्ण प्रभाव पड़ सकता है।
मेरे अनुभव में, सिंगलटन अपनी दक्षता और सरलता के कारण अधिकांश बीन्स के लिए पसंदीदा क्षेत्र है, जबकि प्रोटोटाइप उन विशेष मामलों के लिए आरक्षित है जहां मुझे हर बार एक नए उदाहरण की आवश्यकता होती है। मेरी बीन्स की स्टेटफुलनेस और एप्लिकेशन के भीतर उनका उपयोग कैसे किया जाता है, इस पर ध्यानपूर्वक विचार करके, मैं सूचित निर्णय ले सकता हूं जिससे बेहतर, अधिक रखरखाव योग्य स्प्रिंग एप्लिकेशन बन सकते हैं।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3