6

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

आप किस मामले में प्राथमिकता देते हैं और क्यों? धन्यवाद।

उत्तर

9

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

एक बार जब आप इस सिद्धांत का उल्लंघन करना चुनते हैं, तो इससे कोई फर्क नहीं पड़ता कि आप इसे कैसे करते हैं। ApplicationContextAware विरासत संस्करण है जो लगभग at least since Version 2.0 रहा है। @Autowired एक नया तंत्र है लेकिन वे काफी समान तरीके से काम करते हैं। मैं शायद ApplicationContextAware के साथ जाऊंगा, क्योंकि यह अर्थपूर्ण रूप से स्पष्ट करता है कि यह किस बारे में है।

+0

धन्यवाद। लेकिन क्या होगा यदि बीन, जो अनुप्रयोग कॉन्टेक्स्ट में इंजेक्शन दिया जा रहा है, पहले से ही एक वसंत बीन है? क्या आपको लगता है कि यह अभी भी उल्लंघन है? बीटीडब्ल्यू, वास्तव में मेरे अधिकांश अनुप्रयोगों में वसंत बीन हैं, इसलिए मैं आपके उल्लेख के बारे में थोड़ा उलझन में हूं: 'स्प्रिंग फ्रेमवर्क पर अपना आवेदन टाई'। क्या यह सभी मामलों में या मामले में केवल तभी होता है जब मेरे पास एक ऐसा एप्लिकेशन है जो आंशिक रूप से वसंत ढांचे से अलग हो और मैं वसंत का उपयोग केवल कुछ बीन्स के लिए कुछ कार्यक्षमताओं को प्राप्त करने के लिए करता हूं? – Javatar

+0

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

+0

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

0

चूंकि आप स्प्रिंग कक्षाओं में से कोई भी विस्तार नहीं कर रहे हैं, तो आपका आवेदन हमेशा फ्रेमवर्क से अलग हो जाता है। अधिकांश मामलों में आप ApplicationContext को इंजेक्ट नहीं करना चाहते हैं, लेकिन ApplicationContext में परिभाषित बीन्स इंजेक्ट करने की आवश्यकता होगी।

सबसे अच्छा मामला हमेशा न्यूनतम तक टिकना है, जब तक कि आपके पास कोई विशिष्ट आवश्यकता न हो और वसंत के साथ यह बहुत आसान हो।

तो या तो,

  1. application context में अपने सेम और scan उन्हें एनोटेट, तो @Autowire का उपयोग उन्हें तार की।

  2. 0 बीका उपयोग अपने बीन की गति (पुरानी एक्सएमएल स्टाइल कॉन्फ़िगरेशन) को तार करने के लिए करें। आप इस दृष्टिकोण के साथ @Autowire का भी उपयोग कर सकते हैं।

आप सेम के जीवन चक्र को नियंत्रित करना चाहते हैं, तो आप एपीआई पढ़ सकते हैं और इसे अनुकूलित है, लेकिन समय के सबसे अधिक इन सामान्य सेटिंग्स काम करेगा।

यहां कुछ उदाहरण दिए गए हैं।

  1. Spring Auto-Wiring Beans with @Autowired annotation
  2. Spring Auto-Wiring Beans XML Style
  3. Spring IoC container API Docs
+0

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

+0

"चूंकि आप वसंत वर्गों में से कोई भी विस्तार नहीं कर रहे हैं, इसलिए आपका आवेदन हमेशा ढांचे से अलग होता है"। यह सच नहीं है। बस एप्लीकेशन कॉन्टेक्स्ट इंजेक्शन करने से एप्लिकेशन स्प्रिंग पर संबंध रखता है। यदि वसंत मौजूद नहीं है तो यह संकलित नहीं होगा –

2

@Sean पैट्रिक फ्लोयड कहते हैं, ApplicationContext की जरूरत अक्सर एक बुरा डिजाइन की वजह से है। लेकिन कभी-कभी आपके पास कोई अन्य विकल्प नहीं होता है। उन मामलों में मैं @Autowired का उपयोग पसंद करता हूं क्योंकि जिस तरह से मैं अन्य सभी गुणों को इंजेक्ट करता हूं। इसलिए, अगर मैं MyRepository इंजेक्शन के लिए @Autowired का उपयोग करता हूं, तो मैं इसे एप्लिकेशनकॉन्टेक्स्ट या किसी अन्य स्प्रिंग बीन के लिए क्यों उपयोग नहीं कर सकता?

मैं केवल उन चीजों के लिए स्प्रिंग इंटरफेस का उपयोग करता हूं जो मैं एनोटेशन के साथ नहीं कर सकता, उदाहरण के लिए बीननामएवेयर।

2

यदि आपको सिंगलटन में प्रोटोटाइप प्राप्त करने की आवश्यकता है तो आप विधि इंजेक्शन का उपयोग कर सकते हैं। असल में, आप एक अमूर्त विधि बनाते हैं जो आपको आवश्यक ऑब्जेक्ट देता है और वसंत हर बार जब आप उस विधि को कॉल करते हैं तो प्रोटोटाइप वापस कर देगा। आप अपनी वसंत कॉन्फ़िगरेशन में "लुकअप-विधि" को परिभाषित करते हैं।यहां कुछ लिंक दिए गए हैं: http://docs.spring.io/spring/docs/1.2.9/reference/beans.html#beans-factory-method-injection http://java.dzone.com/articles/method-injection-spring

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