स्प्रिंग बूट में निर्भरता इंजेक्शन: पर्दे के पीछे का जादूगर
क्या आपने कभी ऐसा महसूस किया है कि स्प्रिंग बूट एक जादुई बटलर है जो किसी तरह बस जानता है कि आपको क्या चाहिए और उसे चांदी की थाली में रखकर आपको सौंप देता है? यह मूल रूप से निर्भरता इंजेक्शन (डीआई) है। आपने बिना रुके सैकड़ों बार डीआई का उपयोग किया होगा: आखिर स्प्रिंग को कैसे पता है कि क्या इंजेक्ट करना है और कब?
अगर यह आपके जैसा लगता है, तो आपका स्वागत है! हम एक मज़ेदार, पर्दे के पीछे का दौरा करने जा रहे हैं कि स्प्रिंग बूट का डीआई अपनी जादूगरी कैसे काम करता है, जिसकी शुरुआत यह है कि यह बीन्स, @ऑटोवायर्ड और बीन जीवनचक्र को कैसे प्रबंधित करता है - जन्म से लेकर विनाश तक। इस ब्लॉग के अंत तक, आप एक पेशेवर की तरह अपने नए डीआई ज्ञान का उपयोग कर रहे होंगे।
आम आदमी के शब्दों में, डिपेंडेंसी इंजेक्शन किराने का सामान खुद खरीदने के लिए बाहर जाने के बजाय आपके दरवाजे पर पहुंचाने जैसा है। यह स्प्रिंग को निर्भरता (बीन्स) को "इंजेक्ट" करने की जिम्मेदारी सौंपने के बारे में है ताकि आपको मैन्युअल रूप से ऑब्जेक्ट बनाने या उनके जीवनचक्र के बारे में चिंता न करनी पड़े।
कल्पना करें कि आप एक व्यस्त रसोई चलाने वाले शेफ हैं (आपका आवेदन)। आपके पास हर बार जरूरत पड़ने पर अंडे, दूध और चीनी लेने का समय नहीं है। क्या यह बहुत अच्छा नहीं होगा अगर कोई (कहें, स्प्रिंग) बस जादुई ढंग से आपको वह सब कुछ दे दे जिसकी आपको ज़रूरत थी?
स्प्रिंग डीआई बिल्कुल यही करता है: यह आपके लिए आवश्यक सभी सामग्री (बीन्स) ढूंढता है और आपकी उंगली उठाए बिना उन्हें आपके कोड में इंजेक्ट करता है। बहुत साफ-सुथरा, है ना?
ठीक है, तो यहीं पर जादू होता है। जब आप SpringApplication.run() का उपयोग करके अपना स्प्रिंग बूट ऐप चलाते हैं, तो स्प्रिंग ApplicationContext को बूटस्ट्रैप करता है - इसे अपने बटलर के निर्देश मैनुअल के रूप में सोचें। यह ठीक-ठीक जानता है कि क्या लाना है और कब लाना है।
आइए इसे चरण दर चरण तोड़ें:
कंटेनर आरंभीकरण: जब आप SpringApplication.run() दबाते हैं, तो स्प्रिंग कंटेनर (a.k.a. ApplicationContext) क्रियाशील हो जाता है। यह आपके आभासी रेस्तरां के दरवाजे खोलने जैसा है, जहां सब कुछ शुरू होने के लिए तैयार है।
बीन क्रिएशन: कंटेनर आपके कोड को @Component, @Service, @Repository, या @Controller जैसे एनोटेशन के लिए स्कैन करता है। इनमें से प्रत्येक एक बीन बन जाता है - स्प्रिंग द्वारा प्रबंधित एक वस्तु। इन्हें अपनी रसोई में आवश्यक सामग्री के रूप में सोचें: आटा, चीनी, अंडे, आदि।
बीनफैक्ट्री बचाव के लिए: स्प्रिंग बूट इन बीन्स को बनाने और प्रबंधित करने के लिए बीनफैक्ट्री का उपयोग करता है। यह फ़ैक्टरी ठीक-ठीक जानती है कि आपकी फलियाँ कैसे और कब बनानी हैं, यह सुनिश्चित करते हुए कि वे ज़रूरत पड़ने पर उपलब्ध हों।
निर्भरता इंजेक्शन: एक बार बीन्स तैयार हो जाने के बाद, स्प्रिंग उन्हें वहां इंजेक्ट करता है जहां आपने @Autowired के साथ चिह्नित किया है। यह एक ऐसे बरिस्ता की तरह है जो न सिर्फ कॉफी बनाता है, बल्कि उसे ठीक उसी काउंटर पर पहुंचाता है, जहां उसकी जरूरत होती है। आपको इसके बारे में सोचने की ज़रूरत नहीं है—सब कुछ बस दिखाता है।
आह, अच्छा पुराना @ऑटोवायर्ड एनोटेशन। क्या आपने कभी सोचा है कि स्प्रिंग कैसे जादुई रूप से जानता है कि निर्भरता कहाँ इंजेक्ट करनी है? यह एक जासूस की तरह है जो अपनी रजिस्ट्री में सही बीन्स के साथ आपकी ज़रूरतों से मेल खाता है।
यह ऐसे काम करता है:
प्रकार मिलान: जब स्प्रिंग @Autowired को देखता है, तो वह कंटेनर में उसी प्रकार के बीन की तलाश करता है। कल्पना कीजिए कि आपने कॉफ़ी बीन्स (एक कॉफ़ीसर्विस क्लास) का ऑर्डर दिया है, स्प्रिंग अपनी बीन रिपॉजिटरी में देखता है और कहता है, “आह, मुझे वे मिल गए हैं! मुझे उन्हें आपके लिए इंजेक्ट करने दीजिए।"
क्वालिफायर: लेकिन क्या होगा यदि आपके पास एक ही प्रकार की कई फलियाँ हों? उस स्थिति में, स्प्रिंग घबरा सकता है और "NoUniqueBeanDefinitionException" जैसा अपवाद फेंक सकता है। लेकिन चिंता न करें—आप @Qualifier का उपयोग करके यह निर्दिष्ट करने के लिए स्प्रिंग को शांत कर सकते हैं कि किस बीन को इंजेक्ट करना है:
@Autowired @Qualifier("espressoBean") private CoffeeService coffeeService;
public class CoffeeShop { private final CoffeeService coffeeService; @Autowired public CoffeeShop(CoffeeService coffeeService) { this.coffeeService = coffeeService; } }
स्प्रिंग ऑटोपायलट पर चला जाता है, बीन्स को कंस्ट्रक्टर में इंजेक्ट करता है, और वोइला—आप जाने के लिए तैयार हैं!
स्प्रिंग बूट में बीन्स सिर्फ वस्तुएं नहीं हैं। उनके पास पूर्ण जीवन है, एक मूल कहानी, एक पूर्ण कैरियर और अंततः सेवानिवृत्ति के साथ। आइए एक बीन के जीवनचक्र का अनुसरण करें:
इंस्टेंटिएशन (जन्म): सबसे पहले, स्प्रिंग बीन का एक उदाहरण बनाता है। यह बीन के जन्म की तरह है. वसंत कहता है, "यहाँ तुम जाओ, छोटे लड़के!" और इसे कंटेनर में भेज देता है।
निर्भरता इंजेक्शन: बीन बनाने के बाद, स्प्रिंग इसे निर्भरता से भर देता है (जैसे केक रेसिपी में सामग्री)। यहीं पर @Autowired काम आता है। आपके बीन को वह सब कुछ मिलता है जो उसे ठीक से काम करने के लिए चाहिए।
पोस्ट-इनिशियलाइज़ेशन: यदि आपके पास @PostConstruct के साथ एनोटेटेड तरीके हैं, तो निर्भरता को इंजेक्ट करने के बाद स्प्रिंग उन्हें कॉल करता है। यह बीन को काम पर जाने से पहले उस पर नया रंग चढ़ाने जैसा है।
कार्रवाई के लिए तैयार: अब आपकी बीन जीवित है और काम कर रही है। यह दुनिया से मुकाबला करने के लिए तैयार है!
पूर्व-विनाश (सेवानिवृत्ति): जब एप्लिकेशन बंद हो जाता है, तो स्प्रिंग बीन को एक सुंदर निकास देने के लिए @PreDestroy तरीकों को कॉल करता है। यह बीन की सेवानिवृत्ति पार्टी है, जहां वह अपने संसाधनों को साफ करती है।
बीन का विनाश: अंत में, बीन नष्ट हो गया। शांति से आराम करने का समय।
यहां बताया गया है कि आप इन जीवनचक्र घटनाओं को कोड में कैसे ट्रैक कर सकते हैं:
@Component public class CoffeeBean { @PostConstruct public void onStart() { System.out.println("Bean is ready to brew some coffee!"); } @PreDestroy public void onEnd() { System.out.println("Bean is retiring. Goodbye, world!"); } }
सभी फलियों की जीवन प्रत्याशा समान नहीं होती। स्प्रिंग बूट आपको बीन्स के लिए अलग-अलग स्कोप्स को परिभाषित करने की अनुमति देता है - मूल रूप से वे कितने समय तक जीवित रहते हैं। दो सबसे आम हैं:
सिंगलटन (डिफ़ॉल्ट): बीन का केवल एक उदाहरण है, जो पूरे एप्लिकेशन में साझा किया गया है। यह पूरी कॉफी शॉप के लिए एक एस्प्रेसो मशीन रखने जैसा है।
प्रोटोटाइप: हर बार जरूरत पड़ने पर बीन का एक नया उदाहरण बनाया जाता है। हर एक ऑर्डर के लिए एक ताज़ा एस्प्रेसो मशीन रखने की कल्पना करें। यह संसाधन-भारी है, लेकिन कभी-कभी आवश्यक है।
@Component @Scope("prototype") public class LatteMachine { // This bean is made fresh for every use }
ठीक है, आइए बात करते हैं कि जब आप स्प्रिंगएप्लिकेशन.रन() का उपयोग करके अपना स्प्रिंग बूट ऐप चलाते हैं तो क्या होता है। यह विधि ग्रैंडमास्टर है जो संपूर्ण डीआई प्रक्रिया को प्रारंभ करती है।
अपने स्प्रिंग बूट एप्लिकेशन को एक कॉफ़ी शॉप के रूप में सोचें। आप मालिक हैं, और बीन्स आपकी सामग्री हैं: कॉफी, दूध, चीनी, आदि। इन सामग्रियों को स्वयं प्रबंधित करने के लिए इधर-उधर भागने के बजाय, आपको एक बरिस्ता (स्प्रिंग कंटेनर) मिल गया है जो सब कुछ लाता है और ठीक वहीं पहुंचाता है जहां यह है आवश्यकता है।
आपको बस ऑर्डर देना है (अपना @Autowired फ़ील्ड सेट करें), और बरिस्ता बाकी काम संभाल लेगा - अपने ग्राहकों के लिए निर्भरता से भरे कप कॉफी को पूरी तरह से तैयार करेगा (एप्लिकेशन)।
दिन के अंत में, निर्भरता इंजेक्शन वह है जो स्प्रिंग बूट को इतना शक्तिशाली ढांचा बनाता है। यह आपके जीवन को सरल बनाता है, आपके बीन्स को प्रबंधित करता है, और यह सुनिश्चित करता है कि आपके कोड को बनाए रखना और विस्तारित करना आसान है।
अब जब आपने पर्दे के पीछे झाँक लिया है, तो आपको एक महाशक्ति मिल गई है जिसे कई डेवलपर्स हल्के में लेते हैं। तो आगे बढ़ें—DI का उपयोग उस विज़ार्ड की तरह शुरू करें जैसे आप अभी हैं। और अगली बार जब आप @Autowired देखेंगे, तो आपको ठीक-ठीक पता चल जाएगा कि हुड के नीचे क्या चल रहा है।
मुझे आशा है कि इस ब्लॉग ने आपको स्प्रिंग बूट डीआई की गहरी समझ दी है और आपके चेहरे पर मुस्कान आ गई है। अब कुछ बीन्स इंजेक्ट करें और अपने दोस्तों को दिखाएं कि यह कैसे किया जाता है!
ऐसे ब्लॉग के लिए यह कैसा है जो मज़ेदार, जानकारीपूर्ण और समझने में आसान है? यदि आप कोई और बदलाव चाहते हैं तो मुझे बताएं!
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3