2012-07-26 15 views
5

हम एक नए आवेदन पर काम कर रहे हैं और हम वसंत (कॉलेज प्रोजेक्ट!)क्या वसंत आवेदन में वसंत में 'सबकुछ' वसंत होना चाहिए?

जब आप एक नया वसंत आवेदन लिख रहे हैं, तो प्रत्येक वस्तु को वसंत इंजेक्शन दिया जाना चाहिए?

class A { 
    ... 
    AHelper helper = new AHelper(); 
    helper.doSomething(); 
    ... 
} 

class AHelper { 
    public void doSomething(){} 
} 
  1. इस मामले में, AHelper होना चाहिए स्प्रिंग एक सेटर का उपयोग कर एक में इंजेक्ट किया? यदि कक्षा ए 5 सहायकों पर निर्भर करता है, तो क्या उन सभी को इंजेक्शन दिया जाना चाहिए? क्या यह सबसे अच्छा अभ्यास है और यदि हां हम इससे क्या बाहर निकल रहे हैं?

  2. इसके अलावा, यदि कक्षा एहेल्पर एहेल्परहेल्पर पर निर्भर करता है और बदले में एहेल्परहेल्परहेल्पर पर निर्भर करता है, तो क्या यह संपूर्ण निर्भरता श्रृंखला एक्सएमएल में कॉन्फ़िगर की जानी चाहिए। यह सिर्फ मेरे लिए गलत लगता है!

उत्तर

5

मैंने उन परियोजनाओं को देखा है जिनमें प्रत्येक वस्तु इंजेक्शन दी जाती है, और यह एक दुःस्वप्न है।

  1. आप कॉन्फ़िगर करना उन्हें
  2. स्प्रिंग AOP उपयोग करना चाहते हैं की संभावना हो:

    मैं बड़े पैमाने पर घटक है कि आप का निर्माण और उन्हें वसंत सेम के रूप में बनाते हैं होने की संभावना हो पहचाना जा सकता है उन पर

  3. ग्राहकों इन घटकों

instan के लिए उपयोग कर अपने आवेदन को संयोजित करना चाहते हैं की संभावना है (लेन-देन आदि के लिए जैसे) सीई, मेरे वर्तमान प्रोजेक्ट में, हम नए बड़े पैमाने पर घटकों को स्प्रिंग-सक्षम करते हैं जिन्हें हम रिलीज के लिए सक्षम/अक्षम करना चाहते हैं, या अन्य टीमों का उपभोग होगा, या हमें जेएमएक्स (स्प्रिंग एओपी के माध्यम से) को सक्षम करने की आवश्यकता है।

+0

हम कुछ फैंसी एओपी लॉगिंग चीज़ क्या करना चाहते हैं? हर चीज वसंत इंजेक्शन होना चाहिए? क्या आप सुझाव देते हैं कि आपने 'दुःस्वप्न' से बचने के हित में एओपी लॉगिंग (या कोई भी एओपी जो हर वर्ग को संभावित रूप से छूता है) नहीं कर रहा है? – Mahesh

+0

परीक्षण के बारे में कैसे? यदि आपके सुझावों के आधार पर, मैं ए और एहेल्पर नहीं बनने का फैसला करता हूं (और केवल ए में 'नया एहेलर();') करता हूं और कुछ वास्तविक सेवा के लिए एल्पर वार्ता मानता है, तो मैं अब ए को बिना छूए कैसे परीक्षण कर सकता हूं सर्विस? – Mahesh

2

सबकुछ नहीं। लेकिन उस मामले में, यह शायद एक अच्छा विचार होगा, हाँ। आप जो हासिल करते हैं वह एक नकली AHelper में इंजेक्शन करके यूनिट-टेस्ट A की संभावना है। आप कई अन्य चीजें (सुरक्षा, लेनदेन संबंधी पहलुओं इत्यादि) प्राप्त कर सकते हैं, लेकिन यह संदर्भ पर निर्भर करता है और किस प्रकार की वस्तुओं A और AHelper हैं।

वही आपकी सभी श्रृंखलाओं पर लागू होता है। ध्यान दें कि एक्सएमएल स्प्रिंग एप्लिकेशन को कॉन्फ़िगर करने का पसंदीदा तरीका नहीं है। एनोटेशन का उपयोग करना आसान है, और न्यूनतम XML कॉन्फ़िगरेशन फ़ाइल रखने की अनुमति दें।

3

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

तो, क्या मैं आमतौर पर करते हैं:

  • नियंत्रक, सेवा और भंडार परतों वसंत सेम हैं। वे सभी आम तौर पर एक दूसरे के साथ वायर्ड होते हैं और मुझे एक ही समय में कुछ सेम और कुछ नियमित वस्तुओं के लिए एक अपूर्णता मिलती है।

  • मॉडल इकाइयां स्प्रिंग बीन्स नहीं हैं। मॉडल इकाइयां सिर्फ पीओजेओ हैं, तो आमतौर पर विकास सरल होता है। इसके अलावा, यदि आप एक ही ऑपरेशन में सैकड़ों लोड करते हैं और वे सभी सेम हैं, तो इससे खराब प्रदर्शन हो सकता है।

  • डीटीओ, VO ... अच्छी तरह से, मैं आमतौर पर उन्हें जरूरत नहीं है, लेकिन अगर मैं करते हैं, मैं उन्हें मॉडल संस्थाओं के रूप में व्यवहार करते हैं।

  • उपयोगिता कक्षाएं। उनमें से तीन प्रकार हैं:

    • स्टेटिक विधि वर्ग: जाहिर है कि वे बीन्स नहीं होना चाहिए। यह आपकी मदद नहीं करेगा।

    • सरल ऑब्जेक्ट्स, उदाहरण के लिए अपने स्वयं के मानचित्र: बस उन्हें नियमित वस्तुओं के रूप में छोड़ दें। इस तरह के एक CsvFileConstructor रूप

    • सहायकों, मेरी राय में ये सिर्फ सेवाएं हैं, लेकिन कुछ लोगों को पैकेज util में डाल करने के लिए पसंद करते हैं। वैसे भी, उन्हें आमतौर पर कुछ विन्यास की आवश्यकता होती है (int इस मामले: एन्कोडिंग, बेस पथ, विभाजक ...), ताकि आप उन्हें बीन्स बनाते हुए कुछ लाभ प्राप्त कर सकें।

  • अपवाद, enums ...: जाहिर है, कोई सेम।