स्प्रिंग फ्रेमवर्क क्या करता है? क्या मुझे इसका उपयोग करना चाहिए? क्यों या क्यों नहीं?


236

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

वैसे भी, यहाँ मेरी पृष्ठभूमि और मेरे ऐप के बारे में थोड़ा सा है:

कुछ समय के लिए जावा में विकसित हो रहा है, बैक-एंड वेब डेवलपमेंट कर रहा है। हां, मैं एक टन यूनिट टेस्टिंग करता हूं। इसे सुविधाजनक बनाने के लिए, मैं आमतौर पर एक विधि के दो संस्करणों (कम से कम) बनाता हूं: एक जो उदाहरण चर का उपयोग करता है, और एक जो केवल चर का उपयोग करता है जो विधि में पारित हो जाते हैं। इंस्टा वेरिएबल्स का उपयोग करने वाला व्यक्ति दूसरे को कॉल करता है, उदाहरण के वेरिएबल्स की आपूर्ति करता है। जब यूनिट परीक्षण का समय आता है, तो मैं मॉकिटो का उपयोग वस्तुओं को मॉक करने के लिए करता हूं और फिर उस विधि से कॉल करता हूं जो उदाहरण चर का उपयोग नहीं करता है। यह वही है जो मैंने हमेशा "निर्भरता इंजेक्शन" समझा है।

CS परिप्रेक्ष्य से मेरा ऐप बहुत सरल है। लघु परियोजना, 1-2 डेवलपर्स के साथ शुरू करने के लिए। ज्यादातर CRUD- प्रकार के खोज के साथ गुच्छा का संचालन होता है। मूल रूप से Restful वेब सेवाओं का एक गुच्छा, साथ ही एक वेब फ्रंट-एंड और फिर अंततः कुछ मोबाइल क्लाइंट। मैं सीधे HTML / CSS / JS / JQuery में फ्रंट-एंड करने की सोच रहा हूं, इसलिए JSP का उपयोग करने की कोई वास्तविक योजना नहीं है। Webservices को लागू करने के लिए एक ORM और जर्सी के रूप में हाइबरनेट का उपयोग करना।

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

तो कृपया। मुझे शिक्षित करो। क्या मुझे स्प्रिंग का उपयोग करना चाहिए? क्यों या क्यों नहीं?


10
मुझे लगता है कि आपको वास्तव में यह देखने की ज़रूरत है कि क्या आप इसे पसंद करते हैं और यदि यह आपके प्रोजेक्ट के लिए उपयुक्त है तो कुछ समय के लिए इसे आज़माएं। व्यक्तिगत रूप से मुझे इससे नफरत है।
रिचर्ड

1
जब आप XML या एनोटेशन का उपयोग कर सकते हैं; ध्यान रखें कि वसंत विन्यास मानसिकता पर एक सम्मेलन लेता है। यह जरूरी नहीं कि आप जिन मदों को संबोधित करते हैं, उनकी एक सूची हो ।
आरोन मैकाइवर

14
हालांकि यह सच है कि यह सवाल व्यापक है, लेकिन मुझे लगता है कि इसे खुला रहना चाहिए। मैंने इसे "मध्यम-आकार की परियोजना के लिए स्प्रिंग की पेशकश से क्या लाभ होता है" के रूप में पढ़ा, और यह एक अच्छा सवाल है।
21:12

1
मैं अपनी पसंदीदा तकनीकी पुस्तक पढ़ने की सलाह देता हूं: क्रेग वाल्स द्वारा स्प्रिंग इन एक्शन, तीसरा संस्करण। यह एक शानदार रीड है और आपके प्रोग्राम करने के तरीके को बदल देगा।
अल्फ्रेडाडे

4
एंटरप्राइज जावा को ध्यान में रखते हुए, यह उत्तर देना आसान है कि स्प्रिंग क्या नहीं करता ...
m3th0dman

जवाबों:


108

स्प्रिंग फ्रेमवर्क क्या करता है? क्या मुझे इसका उपयोग करना चाहिए? क्यों या क्यों नहीं?

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

यह वही है जो मैंने हमेशा "निर्भरता इंजेक्शन" समझा है।

मैं एक अलग परिभाषा सुझाऊंगा:

"अपनी वस्तुओं को डिज़ाइन करें ताकि वे एक बाहरी बल पर भरोसा करें कि उन्हें आपूर्ति करने की आवश्यकता है, इस अपेक्षा के साथ कि ये निर्भरताएं हमेशा इंजेक्ट की जाती हैं, इससे पहले कि कोई भी उन्हें अपने सामान्य कार्य करने के लिए कहने के लिए कहता है।"

उस के खिलाफ तुलना करें: "प्रत्येक वस्तु बाहर जाने और सब कुछ खोजने के लिए जिम्मेदार है और इसे शुरू होने पर हर किसी को इसकी आवश्यकता है।"

ऐसा लगता है कि यह XML कॉन्फ़िगरेशन का एक पूरा गुच्छा आवश्यक है

वैसे, अधिकांश XML (या एनोटेशन-आधारित) सामान स्प्रिंग सामान की तरह बता रहा है:

  • जब कोई "हैमरस्टोर" के लिए पूछता है, तो मैं चाहता हूं कि आप इसका एक उदाहरण बनाएं example.HammerStoreऔर इसे वापस लौटाएं। अगली बार उदाहरण के लिए कैश करें, क्योंकि केवल एक स्टोर होना चाहिए।
  • जब कोई "कुछ हैमर" पूछता है, तो मैं चाहता हूं कि आप खुद को "हैमरस्टोर" के लिए कहें, और स्टोर की makeHammer()विधि का परिणाम वापस करें । है यह परिणाम कैश।
  • जब कोई "SomeWrench" के लिए पूछता है, तो मैं चाहता हूं कि आप इसका एक उदाहरण बनाएं example.WrenchImpl, कॉन्फ़िगरेशन सेटिंग का उपयोग करें gaugeAmountऔर इसे इंस्टेंस की setWrenchSize()संपत्ति में डालें । परिणाम कैश न करें।
  • जब कोई "LocalPlumber" के लिए पूछता है, तो मैं आपको एक उदाहरण बनाना चाहता हूं example.PlumberImpl। स्ट्रिंग "पेड्रो" को अपनी setName()विधि में रखें, "Some Hammer" को अपनी setHammer()विधि में रखें, और इसके setWrench()विधि में "SomeWrench" डालें । परिणाम लौटाएं, और परिणाम को बाद में कैश करें क्योंकि हमें केवल एक प्लम्बर की आवश्यकता है।

इस तरह, स्प्रिंग आपके कनेक्ट घटकों को देता है, उन्हें लेबल करता है, उनके जीवन चक्र / कैशिंग को नियंत्रित करता है, और कॉन्फ़िगरेशन के आधार पर व्यवहार में परिवर्तन करता है।

[परीक्षण] की सुविधा के लिए मैं आमतौर पर (कम से कम) एक विधि के दो संस्करण बनाता हूं: एक जो उदाहरण चर का उपयोग करता है, और एक वह जो केवल चर का उपयोग करता है जो विधि में पारित हो जाते हैं।

यह मेरे लिए बहुत अधिक लाभ के लिए ओवरहेड की तरह लगता है। इसके बजाय, अपने उदाहरण के चर बनाने protectedया पैकेज दृश्यता है , और एक ही com.mycompany.whateverपैकेज के अंदर इकाई परीक्षण का पता लगाने । इस तरह से आप जब चाहें परीक्षण के दौरान उदाहरण चर का निरीक्षण और परिवर्तन कर सकते हैं।


65

सबसे पहले, निर्भरता इंजेक्शन क्या है?

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

दूसरा, वसंत का उपयोग XML के बिना किया जा सकता है (या बहुत कम)

यदि आप स्प्रिंग 3.0.5.GA या उच्चतर के साथ गोता लगाते हैं तो आप JDK6 + से निर्भरता इंजेक्शन समर्थन का उपयोग कर सकते हैं। इसका मतलब है कि आप @Componentऔर @Resourceएनोटेशन का उपयोग करके निर्भरता को तार कर सकते हैं।

क्यों वसंत का उपयोग करें?

जाहिर है, निर्भरता इंजेक्शन बहुत आसान इकाई परीक्षण को बढ़ावा देता है क्योंकि आपके सभी वर्ग महत्वपूर्ण निर्भरता के लिए व्यवस्थित होते हैं और आवश्यक व्यवहार प्रदान करने के लिए आसानी से अपने पसंदीदा नकली ढांचे का उपयोग करके मजाक उड़ाया जा सकता है।

इसके अलावा, स्प्रिंग जेईई मानक प्रौद्योगिकियों का उपयोग करने के लिए एक हवा के साथ काम करने के लिए बेस कक्षाओं के रूप में कार्य करने वाले बहुत सारे टेम्पलेट भी प्रदान करता है। उदाहरण के लिए, JdbcTemplate JDBC के साथ अच्छा काम करता है, JpaTemplate JPA के साथ अच्छे काम करता है, JmsTemplate JMS को बहुत सीधा बनाता है। RestTemplate यह सादगी में बस कमाल है। उदाहरण के लिए:

RestTemplate restTemplate = new RestTemplate();
MyJaxbObject o = restTemplate.getForObject("https://secure.example.org/results/{param1}?param2={param2}",MyJaxbObject.class,"1","2");

और आपने कल लिया। पैरामीटर इंजेक्ट किए जाते हैं और आपको केवल MyJaxbObject के लिए JAXB एनोटेशन प्रदान करने की आवश्यकता होती है। अगर आपको ऑटो जेनेरो से मावेन JAXB प्लगइन का उपयोग करके ऑटो-जेनरेट किया गया है तो बिल्कुल भी समय नहीं लेना चाहिए। ध्यान दें कि वहां कोई कास्टिंग नहीं चल रही थी, न ही मार्शलेयर घोषित करने की आवश्यकता थी। यह सब आपके लिए किया गया है।

मैं वसंत के अजूबों के बारे में हमेशा के लिए दफन कर सकता हूं, लेकिन शायद सबसे अच्छी बात यह है कि एक सरल कोड स्पाइक को आज़माएं जहां आप लेनदेन का समर्थन करने वाले एक इंजेक्शन डीएओ से डेटा को पंप करने के लिए एक Restful वेब सेवा को वायर करने का प्रयास करते हैं।


4
हाँ RestTemplate बहुत बढ़िया है। मुझे कोड की 100 लाइनें मिली हैं जिन्हें मैं फेंक सकता हूं और 2-3 लाइनों के साथ बदल सकता हूं।
केविन

11
नाइटपिक के लिए: डिपेंडेंसी इंजेक्शन में कंस्ट्रक्टर-आधारित दृष्टिकोण भी शामिल है। आप बसने की आवश्यकता नहीं है।
डेरेन

28

सबसे पहले, निर्भरता इंजेक्शन की आपकी समझ मौलिक रूप से गलत नहीं है, लेकिन जब वे इस शब्द का उपयोग करते हैं, तो ज्यादातर लोग इससे काफी अलग होते हैं। आप जो वर्णन करते हैं, वह परीक्षण क्षमता को प्राप्त करने के लिए एक अजीब और अपरंपरागत तरीका है। मैं आपको इससे दूर जाने की सलाह दूंगा, क्योंकि अन्य डेवलपर्स उस तरह के कोड से हैरान होंगे।

निर्भरता इंजेक्शन, जैसा कि आम तौर पर समझा जाता है (और स्प्रिंग द्वारा कार्यान्वित) का अर्थ है कि एक वर्ग (जैसे एक जेडीबीसी डेटासोर्स) पर निर्भरताएं वर्ग द्वारा ही नहीं लाई जाती हैं, लेकिन उदाहरण के रूप में निर्मित होने पर एक कंटेनर द्वारा "इंजेक्ट" किया जाता है। तो आपके पास प्रत्येक विधि के दो संस्करण नहीं हैं जो डेटा स्रोत का उपयोग करते हैं; इसके बजाय, आपके पास एक निर्भरता इंजेक्शन कॉन्फ़िगरेशन है जहां "वास्तविक" डेटास्रोत इंजेक्ट किया जाता है और एक जहां एक नकली इंजेक्शन लगाया जाता है। या, यदि इंजेक्शन कंस्ट्रक्टर या एक गेटर के माध्यम से होता है, तो परीक्षण कोड स्पष्ट रूप से इंजेक्शन कर सकता है।

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


ओपी डि को पूरी तरह से अच्छी तरह से समझता है
बसिलेव्स

19

आप स्प्रिंग का उपयोग क्यों करना चाहते हैं, आप इसे http://www.wrox.com/WileyCDA/Section/Why-Use-the-Spring-Framework-.id-130098.html पर पढ़ सकते हैं

संक्षेप में :

  • J2EE अनुप्रयोगों में "प्लंबिंग" कोड की अत्यधिक मात्रा होती है। कई कोड समीक्षाएँ बार-बार कोड का एक उच्च अनुपात प्रकट करती हैं जो कुछ भी नहीं करती हैं: JNDI लुकअप कोड, ऑब्जेक्ट ट्रांसफर करना, JDBC संसाधनों को प्राप्त करने और जारी करने के लिए ब्लॉक को पकड़ना / पकड़ना। । । । इस तरह के प्लूटिंग कोड को लिखना और बनाए रखना संसाधनों पर एक प्रमुख नाली साबित होता है जिसे एप्लिकेशन के व्यावसायिक डोमेन पर केंद्रित किया जाना चाहिए।

  • कई J2EE एप्लिकेशन वितरित ऑब्जेक्ट मॉडल का उपयोग करते हैं जहां यह अनुचित है। यह अत्यधिक कोड और कोड दोहराव के प्रमुख कारणों में से एक है। यह कई मामलों में वैचारिक रूप से गलत भी है; आंतरिक रूप से वितरित अनुप्रयोग सह-स्थित अनुप्रयोगों की तुलना में अधिक जटिल हैं, और अक्सर बहुत कम प्रदर्शन करने वाले होते हैं। बेशक, यदि आपकी व्यावसायिक आवश्यकताएं वितरित आर्किटेक्चर को निर्धारित करती हैं, तो आपको वितरित आर्किटेक्चर को लागू करने और इन-ट्रेड को स्वीकार करने की आवश्यकता है (और स्प्रिंग ऐसे परिदृश्यों में मदद करने के लिए सुविधाएँ प्रदान करता है)। लेकिन आप एक सम्मोहक कारण के बिना ऐसा नहीं करना चाहिए।

  • EJB घटक मॉडल पूर्ववत जटिल है। J2EE अनुप्रयोगों में व्यावसायिक तर्क को लागू करते समय जटिलता को कम करने के एक तरीके के रूप में EJB की कल्पना की गई थी; यह व्यवहार में इस उद्देश्य में सफल नहीं हुआ है।

  • EJB का उपयोग किया जाता है। EJB अनिवार्य रूप से आंतरिक रूप से वितरित, लेनदेन अनुप्रयोगों के लिए डिज़ाइन किया गया था। जबकि लगभग सभी गैर-तुच्छ अनुप्रयोग लेन-देन वाले हैं, वितरण को बुनियादी घटक मॉडल में नहीं बनाया जाना चाहिए।

  • कई "जे 2 ईई डिजाइन पैटर्न" वास्तव में, डिजाइन पैटर्न नहीं हैं, लेकिन प्रौद्योगिकी सीमाओं के लिए वर्कअराउंड हैं। वितरण के अति प्रयोग, और ईजेबी जैसे जटिल एपीआई के उपयोग ने कई संदिग्ध डिजाइन पैटर्न उत्पन्न किए हैं; गंभीर रूप से इनकी जांच करना और सरल, अधिक उत्पादक, दृष्टिकोण की तलाश करना महत्वपूर्ण है।

  • J2EE आवेदन इकाई परीक्षण के लिए कठिन हैं। J2EE एपीआई और विशेष रूप से, EJB घटक मॉडल को चुस्त आंदोलन से पहले ही परिभाषित किया गया था। इस प्रकार उनके डिजाइन इकाई परीक्षण में आसानी को ध्यान में नहीं रखते हैं। एपीआई और निहित अनुबंध दोनों के माध्यम से, आवेदन सर्वर के बाहर ईजेबी और कई अन्य जे 2 ईई एपीआई पर आधारित अनुप्रयोगों का परीक्षण करना आश्चर्यजनक रूप से मुश्किल है। फिर भी एक एप्लिकेशन सर्वर के बाहर इकाई परीक्षण उच्च परीक्षण कवरेज को प्राप्त करने और कई विफलता परिदृश्यों को पुन: पेश करने के लिए आवश्यक है, जैसे कि डेटाबेस से कनेक्टिविटी का नुकसान। यह सुनिश्चित करने के लिए भी महत्वपूर्ण है कि विकास या रखरखाव की प्रक्रिया के दौरान परीक्षण जल्दी से चलाए जा सकते हैं, अनुत्पादक समय का कम से कम उपयोग कर सकते हैं।

  • कुछ J2EE प्रौद्योगिकियां बस विफल हो गई हैं। यहां मुख्य अपराधी इकाई सेम है, जो उत्पादकता के लिए और वस्तु अभिविन्यास पर उनके बाधाओं में बहुत कम साबित हुआ है।


13

हम मूल जावा, सर्वलेट्स और JSP, html और xml, JDBC API का उपयोग करके सरल, कुशल, तेज़ एप्लिकेशन और वेब सेवाएँ लिखते थे। यह काफी अच्छा था; JUnit परीक्षण करने के लिए एक अच्छा उपकरण था। हमने आराम किया कि हमारे कोड ने काम किया।

हाइबरनेट एसक्यूएल को सरल बनाने और जावा ऑब्जेक्ट्स के साथ डेटाबेस तालिकाओं की सही मैपिंग को सक्षम करने के लिए आया, जिससे पदानुक्रमित संबंधों को ऑब्जेक्ट रिलेशनशिप मैपिंग या ओआरएम में प्रतिबिंबित किया जा सके, जैसा कि हम इसे कहते हैं। मैं इसे प्यार करता था। विशेष रूप से यह कि हमें रिजल्टसेट को जावा ऑब्जेक्ट या डेटा प्रकार में वापस मैप करने की आवश्यकता नहीं थी।

हमारे वेब ऐप में मॉडल व्यू कंट्रोलर पैटर्न को जोड़ने के लिए स्ट्रट्स आया, यह अच्छा था।

EJBs एक विशाल ओवरहेड और दर्द थे और एनोटेशन ने कोड को चिकन खरोंच की तरह बनाया और अब वसंत हमें निर्दोष लोगों पर उछला। यह सिर्फ मुझे अतिदेय लगता है।

उदाहरण के लिए, अब हम अपने सरल jdbc url को पैकेज करते हैं, उपयोगकर्ता, पहले jdbc.properties में पास होते हैं, फिर हाइबरनेट गुणों में दूसरे और फिर तीसरी बार स्प्रिंग बीन्स में!

उस सब पर बनाम, एक कनेक्शन पर विचार करें जहां आपको ज़रूरत है कि वास्तव में यह उतना आसान है जितना कि शुद्ध जावा में नीचे दिखाया गया है, जो कि हम वास्तव में वसंत के साथ उस गर्म हवा के सामान के माध्यम से जाने के बाद कर रहे हैं:

Connection connection = DriverManager.getConnection(url, user, pass);

यह अपने आप में व्याख्यात्मक है कि इसके बारे में एक बड़ा दौर और रैपिंग राउंड और राउंड रैपिंग एक साधारण बात करने के लिए तेजी से और आसानी से कोई अन्य बड़ा लाभ नहीं है। यह एक छोटे से अच्छे उपहार के चारों ओर टोंस और गिफ्ट पेपर के टन की तरह है जो कि आप वास्तव में वैसे भी रखते हैं।

एक अन्य उदाहरण बैच अपडेट है। स्प्रिंग के साथ यह काफी कुछ वर्गों से जुड़ा हुआ है, इससे पहले कि आप बैच अपडेट करने के लिए JdbcTemplate का उपयोग कर सकें, इंटरफेस। सादे jdbc के साथ इसके सरल:

Statement statement = connection.createStatement();
statement.addBatch(sqlquery);
statement.executeBatch();

उससे अधिक सरल या तेज नहीं हो सकता।

मैं इस ढांचे का समर्थन नहीं करता। माफ़ करना। पृथ्वी पर कौन चाहता है कि हर बार इंजेक्शन के लिए उन्हें कुछ भी चाहिए?


6
यह कोड सरल है, लेकिन आपकी ट्रांसकेशन हैंडलिंग कहां परिभाषित है और आप इसका परीक्षण कैसे करते हैं? दोनों चीजें वसंत द्वारा सरल हो जाती हैं। इसके अलावा, आप जावा कोड सीधे एक डीबी कनेक्शन से जुड़ा हुआ है, जब तक कि आप कनेक्शन के यूआरएल और पासवर्ड को बाहरी रूप से संग्रहीत नहीं करते हैं, यह भी वसंत द्वारा सरल बना दिया जाता है।
निमचम्पस्की

इस उत्तर के लिए +1, उपरोक्त टिप्पणी को संबोधित करने के लिए, आदमी कनेक्शन पूलिंग के लिए अपने स्वयं के हल्के वजन डिजाइन पैटर्न (GOF), सिंगलटन का उपयोग करता है, एक प्रॉक्सी वर्ग जो डेटाबेस ऑब्जेक्ट (वर्ग) को वर्ग (स्ट्रिंग) और मान (सरणी) प्रदान करता है , http विधि पर निर्भर करता है), dbobject कनेक्शन पूलिंग, लेन-देन इत्यादि को संभालता है, जिसके बाद क्वेरी जारी होती है। सभी मॉड्यूल में एक वस्तु का उपयोग होता है, किसी को अत्यधिक बॉयलर प्लेट कोड की आवश्यकता नहीं होती है। प्रॉक्सी क्लास और dbobject पर यूनिट टेस्ट सेट करने के साथ बोनस पॉइंट।
user2727195

हालांकि स्प्रिंग-डेटा-जेपीए देखें! एक इकाई में एक पोज़ो को एनोटेट करें, एक इंटरफ़ेस लागू करें और उचित नाम का उपयोग करके विधि हस्ताक्षरों को परिभाषित करें, जैसे कि find HammerByWeight (), और वसंत आपके लिए तरीकों को लागू करता है, आपको एक इंजेक्शन योग्य रिपॉजिटरी देता है जिसे आप अपने सभी अन्य व्यावसायिक सेवा या नियंत्रक वर्गों में उपयोग कर सकते हैं ।
mancini0

13

स्प्रिंग फ्रेमवर्क क्या करता है?

वसंत आज के रूप में ही नहीं है, जिसे एक साधारण ढांचे के रूप में जाना जाता था, यह एक पूर्ण पारिस्थितिकी तंत्र है।

वसंत पारिस्थितिकी तंत्र द्वारा कवर विषय:

  • स्प्रिंग फ्रेमवर्क (उदाहरण के लिए निर्भरता इंजेक्शन, AOP ...)

  • वसंत मेघ

  • स्प्रिंग डेटा

  • वसंत सुरक्षा

  • स्प्रिंग बैच

  • वसंत सामाजिक

पारिस्थितिकी तंत्र की पूरी कवरेज के लिए यहां देखें । चेरी-पिक परियोजनाओं के लिए संभव है, ताकि आप सुरक्षा संबंधी चीजों को संभालने के लिए DI और उदा स्प्रिंग सिक्योरिटी के लिए Google Guice का उपयोग कर सकें । YOu को पूरे पारिस्थितिकी तंत्र में खरीदने की ज़रूरत नहीं है।

स्प्रिंग-फ्रेमवर्क आज ही मुख्य रूप से शामिल है

  • निर्भरता अन्तःक्षेपण

  • स्प्रिंग के घोषणात्मक लेनदेन प्रबंधन सहित पहलू-उन्मुख प्रोग्रामिंग

  • स्प्रिंग एमवीसी वेब एप्लीकेशन और रेस्टफुल वेब सर्विस फ्रेमवर्क

  • JDBC, JPA, JMS के लिए मूलभूत समर्थन

स्रोत वसंत

सामान्य तौर पर, आप कह सकते हैं, कि स्प्रिंग कोड में कार्यान्वित पैटर्न और प्रथाओं का एक संग्रह है, जो आपके एप्लिकेशन विकास चक्र को बेहतर बनाने या गति प्रदान करने में मदद कर सकता है।

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

निर्भरता इंजेक्शन क्या है?

निर्भरता इंजेक्शन का मतलब है, कि आपकी वस्तु एक बाहरी तंत्र के माध्यम से अन्य वस्तुओं के लिए हर निर्भरता प्राप्त करती है।

कहो, आपके पास एक कार है, विशिष्ट तरीका है, इसे लागू किया गया है:

public class Car {

    Engine e;

    public Car() { 
        e = new Engine(); 
    }

}

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

अब निर्भरता इंजेक्शन खेलने में आता है:

public class Car {

    Engine e;

    public Car(Engine e) { 
        this.e = e; 
    }

}

उसके बाद, आप इंजन स्विच करने में सक्षम हैं। जो आप ऊपर देख रहे हैं उसे कंस्ट्रक्टर इंजेक्शन कहा जाता है । अन्य प्रकार हैं जैसे कि सेटर- इनजेक्शन या मेथड- इनजेक्शन। वसंत आपको इसमें कैसे मदद करता है? स्प्रिंग इसे एनोटेशन के साथ इंजेक्ट किए जाने वाले घटकों को चिह्नित करने की अनुमति देता है @Autowiredऔर इंजेक्टेड ऑब्जेक्ट की वायरिंग स्वचालित रूप से करता है - यह संभावना है, कि आप जिस घटक को इंजेक्ट करना चाहते हैं, उसकी निर्भरताएं हैं। इंजेक्शन - ऐसा कहने के लिए - के माध्यम से चिह्नित कर रहे हैं@Component

public class Car {

    Engine e;

    @Autowired
    public Car(Engine e) { 
        this.e = e; 
    }

}

लेकिन यह वसंत की पेशकश की जाने वाली कई विशेषताओं में से एक है।

क्या मुझे स्प्रिंग का उपयोग करना चाहिए? क्यों या क्यों नहीं?

चूंकि वसंत बहुत घुसपैठ नहीं है और आपको वसंत ऋतु का उपयोग करने पर विचार करना चाहिए जो कई एड्स प्रदान करता है। विशेष रूप से नई परियोजनाओं के लिए, स्प्रिंग बूट बहुत आकर्षक है। start.spring.io आरंभ करने के लिए प्रोजेक्ट टेम्पलेट उत्पन्न करने के लिए point'n'click -interface का उपयोग करने के लिए एक आसान प्रदान करता है । curlएक टेम्पलेट को पुनः प्राप्त करने के लिए उपयोग करना संभव है :

curl start.spring.io

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

:: Spring Initializr ::  https://start.spring.io

This service generates quickstart projects that can be easily customized.
Possible customizations include a project's dependencies, Java version, and
build system or build structure. See below for further details.

The services uses a HAL based hypermedia format to expose a set of resources
to interact with. If you access this root resource requesting application/json
as media type the response will contain the following links:
+-----------------+-----------------------------------------+
| Rel             | Description                             |
+-----------------+-----------------------------------------+
| gradle-build    | Generate a Gradle build file            |
| gradle-project  | Generate a Gradle based project archive |
| maven-build     | Generate a Maven pom.xml                |
| maven-project * | Generate a Maven based project archive  |
+-----------------+-----------------------------------------+

...

दूसरी ओर, स्पार्क या ड्रॉपवॉडर जैसी रूपरेखाएँ त्वरित वेब-ऐप निर्माण के लिए भी एक अच्छा शुरुआती बिंदु प्रदान करती हैं।


1
बहुत जानकारीपूर्ण उत्तर!
GOXR3PLUS

सहमत, बहुत अच्छा जवाब। ओपी, मुझे आपसे सहानुभूति है। मैंने कई लोगों को स्प्रिंग डेमोस भी दिखाया है, जहाँ वे XML फ़ाइल और इनडायरेक्शन की 2 परतों को जोड़कर कोड को "सरल" करते हैं, ताकि वे कंस्ट्रक्टर को क्लास में बुला सकें :) आपको वास्तव में गोता लगाने या इसमें जाने की आवश्यकता है वास्तव में अच्छी प्रस्तुति और अंततः यह स्पष्ट हो जाएगा कि लाभ और कमियां कहां हैं
एडम ह्यूजेस

4

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

स्प्रिंग के बारे में जानने के लिए एक अच्छी किताब है: एक्सपर्ट स्प्रिंग एमवीसी और वेब फ्लो

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.