2011-04-20 17 views
20

मैं वर्तमान में एक दुकान पर काम करते हुए "प्रभावी जावा" पढ़ रहा हूं जो वसंत निर्भरता इंजेक्शन का भारी उपयोग करता है। ब्लोच की पुस्तक को पढ़ते समय कोई मदद नहीं कर सकता है, लेकिन वह कक्षाओं में अपरिवर्तनीयता पर जोर देता है (वह कई बार कहता है कि वर्ग जितना संभव हो उतना अपरिवर्तनीय होना चाहिए)। मैं मदद नहीं कर सकता लेकिन इस संबंध में प्रत्यक्ष संघर्ष में महसूस करता हूं कि स्प्रिंग निर्भरता इंजेक्शन (और उस तथ्य के लिए अधिकांश डीआई इंजन) javabeans मानक पर है। 'स्प्रिंग इन एक्शन' पढ़ना डी पर अध्यायों की तरह प्रतीत होता है कि वे ब्लॉच क्रिंग को अपने उत्परिवर्ती वर्गों के साथ अपने अधिकार के बाहर तुरंत ऑब्जेक्ट्स से बनाते हैं जो अपने अधिकार में उत्परिवर्तनीय हो सकते हैं।उत्परिवर्तन और वसंत

क्या यह है कि ब्लोच के विचार वसंत के लिए बहुत उपन्यास हैं? क्या स्प्रिंग मॉडल बस्टेड है? क्या अपरिवर्तनीयता पर ब्लोच का रुख केवल लाइब्रेरी कोड लिखने पर लागू होता है? स्प्रिंग कोड लिखते समय मुझे लचीली वस्तुओं को बहुत सारे गेटर्स और सेटर्स के साथ लिखना चाहिए या कन्स्ट्रक्टर में सबकुछ लोड करना चाहिए?

+3

ब्लॉच यह नहीं कहता कि "चीजों को म्यूटेबल कभी नहीं बनाते" वह कहता है, "उन्हें आवश्यकतानुसार और अधिक परिवर्तनीय न बनाएं"। यदि आपके ढांचे में निश्चित रूप से उत्परिवर्तन का स्तर आवश्यक है, तो यही वह है जिसके साथ आपको रहना है। – skaffman

+1

उत्परिवर्तन, टेलीस्कोपिंग कन्स्ट्रक्टर, और बिल्डर पैटर्न के बारे में आइटम में अच्छी तरह से वह जवाबीन मानक (इसे पुराने रूप में संदर्भित करता है) को ट्रैश करता है, लेकिन यह मानक स्प्रिंग का आधार है जिसका मतलब वसंत पुराना है? – nsfyn55

+0

वसंत javabeans मानक पर कोई निर्भरता नहीं है। – Bozho

उत्तर

11

वास्तव में, वसंत सेम विचार से अपरिवर्तनीय हैं, भले ही आप इसे लागू नहीं कर रहे हों।

आप केवल final फ़ील्ड को एक गेटर प्रदान कर सकते हैं जो कि कन्स्ट्रक्टर इंजेक्शन के माध्यम से प्रारंभ किया गया है।

आमतौर पर आप ऐसा नहीं करते हैं, लेकिन आपको डी फ्रेमवर्क द्वारा इंजेक्शन वाले बीन्स के खेतों को फिर से सौंपना नहीं चाहिए। ऐसा इसलिए है क्योंकि वसंत सेम आमतौर पर अपनी निर्भरताओं के अलावा किसी भी राज्य को नहीं पकड़ते हैं (और उनका दायरा सिंगलटन है)। बेशक, प्रोटोटाइप और स्कोप्ड बीन्स के अनुरोध जैसे अपवाद हैं, ये दुर्लभ हैं (उदाहरण के लिए 2 बड़ी और 2 मध्यम परियोजनाओं में मैंने केवल 1 प्रोटोटाइप-स्कोप्ड बीन का उपयोग किया है)

+3

मैं मानता हूं: अधिकांश वसंत instanciated वस्तु "सिंगलटन" हैं और वास्तव में "mutable" नहीं (सेवाओं, दास, नियंत्रक, लेनदेन प्रबंधक, ...)। – Tristan

+0

यदि मैं एक अंतिम क्षेत्र में एक म्यूटेबल ऑब्जेक्ट इंजेक्ट करता हूं जो उस ऑब्जेक्ट को बदलने से नहीं रोकता है जिसके परिणामस्वरूप एक नाजुक ऑब्जेक्ट ग्राफ़ – nsfyn55

+0

@ nsfyn55 होता है तो यह पूरी तरह से आपके ऊपर इंजेक्ट करने के लिए निर्भर करता है। डीआई के साथ इसका कोई लेना-देना नहीं है। – Bozho

9

आप कक्षाओं को अपरिवर्तनीय और अभी भी रख सकते हैं यदि आप कन्स्ट्रक्टर-आधारित इंजेक्शन का उपयोग करते हैं तो निर्भरता इंजेक्शन का उपयोग करें। इस तरह आप अनावश्यक सेटर्स से बच सकते हैं।

2

मुझे विशेष रूप से स्प्रिंग एमवीसी के साथ संघर्ष नहीं दिख रहा है। वसंत से कौन से सेम प्रबंधित होते हैं? अधिकतर आपके नियंत्रक और आपकी सेवा/डेटा में आपके डीएओ और सेवाओं को लेयर करते हैं। इनका आमतौर पर कोई असली स्थिति नहीं होती है और कोई भी सेटर्स नहीं होता है। यदि आपकी समस्या सेटर इंजेक्शन के साथ निहित है (उदाहरण के लिए, आपकी अपनी कक्षा है जिसे स्प्रिंग द्वारा प्रबंधित करने की आवश्यकता है और आप कुछ फ़ील्ड के लिए सेटर्स नहीं चाहते हैं) तो आप इसके बजाय कन्स्ट्रक्टर इंजेक्शन का उपयोग कर सकते हैं (या दोनों को गठबंधन कर सकते हैं)।

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