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