लंबे समय तक मेरा मानना था कि "केंद्रीकृत, घोषणात्मक, विन्यास" जैसे xml फ़ाइलों की हम सभी का उपयोग करने के लिए उपयोग किया गया था। तब मुझे एहसास हुआ कि फाइलों में अधिकांश सामान कॉन्फ़िगरेशन नहीं था - यह कभी भी विकास के बाद कहीं भी नहीं बदला गया था। तब मुझे एहसास हुआ कि "केंद्रीकृत" में केवल छोटे सिस्टमों में मूल्य है - केवल छोटे सिस्टम में आप कभी भी को एक संपूर्ण के रूप में कॉन्फ़िगरेशन फ़ाइल को ग्रोक करने में सक्षम होंगे। और पूरी तरह तारों को समझने का मूल्य वास्तव में क्या है, जब कोड में निर्भरताओं द्वारा वही "वाइरिंग" अधिकतर डुप्लिकेट किया जाता है? इसलिए मैंने जो एकमात्र चीज रखी है वह मेटा-डेटा (एनोटेशन) है, जो अभी भी घोषणात्मक है। ये कभी भी रनटाइम पर बदलते हैं और वे कभी "कॉन्फ़िगरेशन" डेटा नहीं है कि कोई फ्लाई पर बदल जाएगा - इसलिए मुझे लगता है कि कोड में इसे रखना अच्छा है।
मैं जितना संभव हो उतना ऑटो-वायरिंग का उपयोग करता हूं। मुझे यह पसंद है। जब तक बंदूक बिंदु पर धमकी नहीं दी जाती तब तक मैं पुरानी शैली के वसंत में वापस नहीं जाऊंगा। पूरी तरह से @Autowired
पसंद करने के मेरे कारण समय के साथ बदल गए हैं।
अभी मुझे लगता है कि ऑटोवॉयरिंग का उपयोग करने का सबसे महत्वपूर्ण कारण यह है कि आपके सिस्टम में ट्रैक रखने के लिए एक कम अमूर्तता है। "बीन नाम" प्रभावी रूप से चला गया है। यह पता चला है कि बीन नाम केवल एक्सएमएल के कारण मौजूद है। तो अमूर्त संकेतों की एक पूर्ण परत (जहां आप बीन "बार" में बीन-नाम "foo" तार करेंगे) चला गया है। अब मैं सीधे अपने बीन में "फू" इंटरफेस को तार करता हूं, और कार्यान्वयन रन-टाइम प्रोफाइल द्वारा चुना जाता है। यह निर्भरता और कार्यान्वयन का पता लगाने पर कोड के साथ काम करने की अनुमति देता है। जब मैं अपने कोड में एक स्वायत्त निर्भरता देखता हूं तो मैं अपने आईडीई में "कार्यान्वयन पर जाएं" कुंजी दबा सकता हूं और ऊपर ज्ञात कार्यान्वयन की सूची आता है। ज्यादातर मामलों में केवल एक कार्यान्वयन होता है और मैं सीधे कक्षा में हूं। इससे कहीं अधिक सरल नहीं हो सकता है, और मुझे हमेशा बिल्कुल का कार्यान्वयन किया जा रहा है (मेरा दावा है कि विपरीत एक्सएमएल तारों के साथ सत्य के करीब है - मजाकिया कैसे आपका परिप्रेक्ष्य बदलता है!)
अब आप कर सकते हैं कहें कि यह सिर्फ एक बहुत ही सरल परत है, लेकिन हमारे सिस्टम में डालने वाले अमूर्तता की प्रत्येक परत जटिलता में वृद्धि करती है। मुझे सच में नहीं लगता कि एक्सएमएल ने कभी भी किसी भी सिस्टम के लिए कोई वास्तविक मूल्य जोड़ा है जिसके साथ मैंने काम किया है।
अधिकांश सिस्टम जिनके साथ मैंने कभी काम किया है, केवल एक उत्पादन रनटाइम पर्यावरण की कॉन्फ़िगरेशन है। परीक्षण के लिए अन्य विन्यास भी हो सकते हैं।
मैं कहूंगा कि पूर्ण स्वायत्तता वसंत की रूबी-ऑन-रेल है: यह धारणा को गले लगाती है कि एक सामान्य और सामान्य उपयोग पैटर्न है जो अधिकांश मामलों का पालन करता है। एक्सएमएल कॉन्फ़िगरेशन के साथ आप परमिट बहुत संगत/असंगत कॉन्फ़िगरेशन उपयोग जो इरादा हो सकता है/नहीं हो सकता है। मैंने इतनी एक्सएमएल कॉन्फ़िगरेशन को असंगतता के साथ ओवरबोर्ड पर देखा है - क्या यह कोड के साथ एक साथ फिर से काम करता है? सोचा नहीं क्या एक कारण के लिए वे बदलाव हैं? आमतौर पर नहीं।
हम शायद ही कभी हमारे कॉन्फ़िगरेशन में क्वालीफायर का उपयोग करते हैं, और इन स्थितियों को हल करने के अन्य तरीकों को ढूंढते हैं। यह एक स्पष्ट "हानिकारक" है जिसका हम सामना करते हैं: हमने कोड को जिस तरह से कोड करने के लिए इसे ऑटोवॉयरिंग के साथ आसान तरीके से बदल दिया है: एक ग्राहक भंडार अब सामान्य Repository<Customer>
इंटरफ़ेस लागू नहीं करता है लेकिन हम Repository<Customer>
को इंटरफ़ेस CustomerRepository
बनाते हैं। कभी-कभी उप-वर्गीकरण की बात आती है तो एक चाल या दो भी होती है। लेकिन यह आमतौर पर हमें मजबूत टाइपिंग की दिशा में इंगित करता है, जो मुझे लगता है कि लगभग हमेशा एक बेहतर समाधान होता है।
लेकिन हां, आप DI की एक विशेष शैली को जोड़ रहे हैं जो ज्यादातर वसंत करता है। हम निर्भरताओं के लिए सार्वजनिक सेटर्स को और भी नहीं बनाते हैं (इसलिए आप तर्क दे सकते हैं कि हम encapsulation/सूचना छिपाने वाले विभाग में +1 हैं) हमारे पास अभी भी हमारे सिस्टम में कुछ XML है, लेकिन xml मूल रूप से केवल विसंगतियों में शामिल है । पूर्ण ऑटोवॉयरिंग xml के साथ अच्छी तरह से एकीकृत करता है।
केवल एक चीज अब हम की जरूरत है @Component
, @Autowired
और आराम के लिए है एक JSR (JSR-250 की तरह) में शामिल किया जाना है, तो हम वसंत के साथ में टाई की जरूरत नहीं है। अतीत में चीजें हो रही हैं (java.util.concurrent
सामान स्प्रिंग्स दिमाग में), इसलिए अगर यह फिर से हुआ तो मैं पूरी तरह से आश्चर्यचकित नहीं होगा।
मुझे इस विषय में भी रूचि है - एक्सएमएल के बजाए एनोटेशन के माध्यम से अपने एमवीसी ऐप को कॉन्फ़िगर करना ऐसा लगता है कि इससे "यूआरएल में कौन सी क्लास मैप की गई है?" "यह कौन संभाला जा रहा है?"। मुझे एक विन्यास स्रोत –
शब्द "@Autowiring" शब्द यहां गुमराह करना प्रतीत होता है।चूंकि आप एक्सएमएल कॉन्फ़िगरेशन के साथ ऑटोवॉयरिंग भी कर सकते हैं, मूल प्रश्न को "स्प्रिंग एनोटेशन का उपयोग करने के पेशेवरों और विपक्ष" के रूप में दोहराया जाना चाहिए। प्रदान किया गया उत्तर ऑटोवॉयरिंग के पहलुओं और एनोटेशन का उपयोग करने के पहलुओं पर कम केंद्रित करता है। –
[वसंत @Autowired उपयोग को समझना] के संभावित डुप्लिकेट (https://stackoverflow.com/questions/19414734/understanding-spring-autowired-usage) – tkruse