वास्तव में स्प्रिंग फ्रेमवर्क क्या है? [बन्द है]


623

मैंने वसंत के बारे में बहुत सुना है , लोग पूरे वेब पर कह रहे हैं कि वसंत वेब विकास के लिए एक अच्छा ढांचा है। वास्तव में स्प्रिंग फ्रेमवर्क क्या है?


10
मैं समझता हूं कि प्रश्न बहुत व्यापक है, लेकिन मुझे लगता है कि इस बहुत ही विशिष्ट मामले में यह सवाल उन जूनियर डेवलपर्स के लिए बहुत महत्वपूर्ण है जो अक्सर स्प्रिंग के बारे में ऐसे लोगों से बात करते हैं जो यह मानते हैं कि यह काफी लोकप्रिय है, यहां तक ​​कि यह बताने की भी जरूरत नहीं है कि क्या है ऐसा होता है। आखिरकार, अगर आपने कभी इंस्टाग्राम के बारे में नहीं सुना और उसका उद्देश्य क्या है, तो अपना हाथ बढ़ाएं। (स्वीकारोक्ति: मैंने कभी इंस्टा का इस्तेमाल नहीं किया)
usr-local-

2
10 साल पहले सवाल पूछा गया था, और उस समय स्प्रिंग अपने सभी उप परियोजनाओं, जैसे स्प्रिंग बूट, स्प्रिंग डेटा, स्प्रिंग रेस्ट, इत्यादि से थोड़ा छोटा था और वास्तव में इसीलिए यह एक साल पहले करीब था, क्योंकि इस सवाल की व्यापकता। जिस समय मैंने यह प्रश्न पूछा, मैं सिर्फ DI को समझना चाहता था और इसकी आवश्यकता क्यों है।
Maksim

जवाबों:


713

मूल रूप से वसंत के लिए एक रूपरेखा है यह एक ऐसा पैटर्न है जो बहुत कम प्रणाली के निर्माण की अनुमति देता है।

समस्या

उदाहरण के लिए, मान लीजिए कि आपको सिस्टम के उपयोगकर्ताओं को सूचीबद्ध करने की आवश्यकता है और इस प्रकार एक इंटरफ़ेस घोषित किया जाता है UserLister:

public interface UserLister {
    List<User> getUsers();
}

और हो सकता है कि सभी उपयोगकर्ताओं को प्राप्त करने के लिए एक डेटाबेस तक पहुँचने वाला कार्यान्वयन:

public class UserListerDB implements UserLister {
    public List<User> getUsers() {
        // DB access code here
    }
}

आपके विचार में आपको एक उदाहरण (केवल एक उदाहरण, याद रखना) तक पहुँचने की आवश्यकता होगी:

public class SomeView {
    private UserLister userLister;

    public void render() {
        List<User> users = userLister.getUsers();
        view.render(users);
    }
}

ध्यान दें कि ऊपर दिए गए कोड ने वैरिएबल को इनिशियलाइज़ नहीं किया है userLister। क्या करे? अगर मैं स्पष्ट रूप से इस तरह से वस्तु को तुरंत हटा दूं:

UserLister userLister = new UserListerDB();

... मैं डीबी तक पहुँचने वाले वर्ग के अपने कार्यान्वयन के साथ दृश्य को देखूंगा। क्या होगा यदि मैं DB कार्यान्वयन से दूसरे पर स्विच करना चाहता हूं जो उपयोगकर्ता सूची को अल्पविराम से अलग की गई फ़ाइल से प्राप्त करता है (याद रखें, यह एक उदाहरण है)? उस स्थिति में, मैं फिर से अपने कोड में जाऊंगा और उपरोक्त पंक्ति को इसमें बदलूंगा:

UserLister userLister = new UserListerCommaSeparatedFile();

इस तरह के एक छोटे से कार्यक्रम के साथ कोई समस्या नहीं है लेकिन ... एक कार्यक्रम में क्या होता है जिसमें सैकड़ों विचार और समान संख्या में व्यापारिक वर्ग होते हैं? रखरखाव एक बुरा सपना बन जाता है!

वसंत (निर्भरता इंजेक्शन) दृष्टिकोण

स्प्रिंग एक्सएमएल फ़ाइल या एनोटेशन का उपयोग करके कक्षाओं को तार करने के लिए क्या करता है , इस तरह से सभी ऑब्जेक्ट्स को स्प्रिंग द्वारा इंस्टेंट और इनिशियलाइज़ किया जाता है और सही स्थानों (सर्वलेट्स, वेब फ्रेमवर्क, बिज़नेस क्लासेस, डीएओ, इत्यादि) आदि में इंजेक्ट किया जाता है। ...)।

वसंत में उदाहरण के लिए वापस जा रहे हैं हम सिर्फ userListerक्षेत्र के लिए एक सेटर की जरूरत है और इस तरह एक XML फ़ाइल है:

<bean id="userLister" class="UserListerDB" />

<bean class="SomeView">
    <property name="userLister" ref="userLister" />
</bean>

या अधिक बस हमारे दृश्य वर्ग में दर्ज एनोटेट के साथ @Inject:

@Inject
private UserLister userLister;

इस तरह जब दृश्य बनाया जाता है तो यह जादुई रूपUserLister से काम करने के लिए तैयार होगा ।

List<User> users = userLister.getUsers();  // This will actually work
                                           // without adding any line of code

यह बहुत अच्छा है! है ना?

  • यदि आप अपने UserListerइंटरफ़ेस के किसी अन्य कार्यान्वयन का उपयोग करना चाहते हैं तो क्या होगा ? बस XML बदलें।
  • क्या होगा अगर एक UserListerकार्यान्वयन तैयार नहीं है ? के एक अस्थायी मॉक क्रियान्वयन का कार्यक्रम UserListerऔर दृश्य के विकास में आसानी।
  • अगर मैं स्प्रिंग का उपयोग नहीं करना चाहता, तो क्या होगा? बस इसका इस्तेमाल न करें! आपके एप्लिकेशन को इसके लिए युग्मित नहीं किया गया है। नियंत्रण का व्युत्क्रम बताता है: "अनुप्रयोग ढांचे को नियंत्रित करता है, न कि रूपरेखा अनुप्रयोग को नियंत्रित करता है"।

वहाँ पर निर्भरता इंजेक्शन के लिए कुछ अन्य विकल्प हैं, मेरी राय में, वसंत ने अपनी सादगी, लालित्य और स्थिरता के अलावा इतना प्रसिद्ध बना दिया है कि स्प्रिंगसोर्स के लोगों ने कई POJOs को क्रमादेशित किया है जो वसंत को कई अन्य सामान्य लक्षणों के साथ एकीकृत करने में मदद करते हैं। अपने आवेदन में घुसपैठ। इसके अलावा, स्प्रिंग में कई अच्छे सबप्रोजेक्ट्स होते हैं जैसे स्प्रिंग MVC, स्प्रिंग वेबफ्लो, स्प्रिंग सिक्योरिटी और फिर से आदिवासियों की एक लुओंग लिस्ट।

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


148
कोड की एक लाइन और XML की एक लाइन को बदलने के बीच अंतर को व्हाट्सएप करें? प्रयास और रखरखाव नरक बिल्कुल वैसा ही है, या इससे भी बदतर है, क्योंकि बाहरी xml फ़ाइलें यकीनन जटिलता जोड़ती हैं? क्षमा करें, लेकिन मुझे अभी नहीं मिला है, मुझे कोई फायदा नहीं दिख रहा है। अगर मुझे कुछ याद आ रहा है तो कृपया मुझे भरें।
फ्रेड

23
@fred - कल्पना करें कि आप इकाई परीक्षण कर रहे हैं। निर्भरता इंजेक्शन के बिना (DI एनोटेशन के साथ या एक्सएमएल के साथ इस्तेमाल किया जा सकता है) आप ठीक से परीक्षण नहीं कर सकते, क्योंकि आप निर्भरता का मजाक नहीं उड़ा सकते हैं।
पेटर मिनचेव

18
@fred - एक्सएमएल में सभी इंजेक्शन को परिभाषित करना वास्तव में कम मायने रखता है। इसे बनाए रखने के लिए बड़े पैमाने पर ओवरहेड है। वहाँ EJB इंजेक्शन बिंदुओं के लिए एनोटेशन की अवधारणा शुरू की। वे बहुत सरल हैं और एक डिफ़ॉल्ट उदाहरण इंजेक्ट किया जाएगा (इकाई परीक्षणों के लिए इसे एक बार बदला जा सकता है)। इसने इतनी अच्छी तरह से काम किया कि वसंत ने अब इस दृष्टिकोण की नकल की। ध्यान दें कि यदि आवश्यक हो (लेकिन केवल यदि वास्तव में आवश्यक हो) तो भी एनजेई में ईजेबी द्वारा एनोटेशन को ओवरराइड किया जा सकता है।
माइक ब्रौन

36
या, आप जानते हैं, एक कारखाना स्थैतिक विधि का उपयोग करें। फैक्ट्री के रिटर्न प्रकार को बदलें, और अब उस रिटर्न का उपयोग करने वाले सभी वर्गों को बदल दिया जाता है। प्रेस्टो स्प्रिंग की अब जरूरत नहीं है ...
Qix - MONICA WIST MISTREATED

16
@mmcrae मैं XML लिखने की बजाय अपनी IDE में एक रीफैक्टराइज़ेशन कॉल करना चाहूंगा।
Qix - मोनासा

63

स्प्रिंग में MVC फ्रेमवर्क शामिल है ( जैसा कि स्कैफमैन ने सही बताया है )। यहाँ संक्षेप में समझाने के लिए मेरे इनपुट हैं। स्प्रिंग सेवा परत, वेब परत और व्यावसायिक परत के अलगाव का समर्थन करता है, लेकिन यह वास्तव में जो सबसे अच्छा करता है वह वस्तुओं का "इंजेक्शन" है। इसलिए यह समझाने के लिए कि उदाहरण के साथ नीचे दिए गए उदाहरण पर विचार करें:

public interface FourWheel
{
   public void drive();
}

public class Sedan implements FourWheel
{
   public void drive()
   {
      //drive gracefully
   }
}

public class SUV implements FourWheel
{
   public void drive()
   {
      //Rule the rough terrain
   }
}

अब आपके कोड में आपके पास निम्नानुसार रोडट्रिप नामक एक वर्ग है

public class RoadTrip
{
    private FourWheel myCarForTrip;
}

अब जब भी आपको ट्रिप का उदाहरण चाहिए; कभी-कभी आप फोरव्हील को इनिशियलाइज़ करने के लिए एसयूवी चाहते हैं या कभी-कभी आप सेडान चाहते हो सकते हैं। यह वास्तव में निर्भर करता है कि आप विशिष्ट स्थिति के आधार पर क्या चाहते हैं।

इस समस्या को हल करने के लिए आप चाहते हैं कि एक फैक्टरी पैटर्न क्रिएशनल पैटर्न के रूप में हो। जहां एक कारखाना सही उदाहरण देता है। तो अंत में आप बहुत से गोंद कोड के साथ समाप्त हो जाएगा बस वस्तुओं को सही ढंग से पलटने के लिए। वसंत उस गोंद कोड के बिना गोंद कोड का काम सबसे अच्छा करता है। आप XML में मैपिंग की घोषणा करते हैं और यह स्वचालित रूप से ऑब्जेक्ट को इनिशियलाइज़ करता है। यह उदाहरणों के लिए सिंगलटन आर्किटेक्चर का उपयोग करने के लिए बहुत कुछ करता है और यह अनुकूलित मेमोरी उपयोग में मदद करता है।

इसे उलटा नियंत्रण भी कहा जाता है। ऐसा करने के लिए अन्य चौखटे हैं गूगल गुइसा, पिको कंटेनर आदि।

इसके अलावा, स्प्रिंग के पास सत्यापन ढांचा है, JDBC, iBatis और हाइबरनेट (और कई और अधिक) के साथ DAO परत के लिए व्यापक समर्थन। डेटाबेस लेनदेन पर उत्कृष्ट लेनदेन नियंत्रण प्रदान करता है।

स्प्रिंग के लिए बहुत कुछ है जिसे "प्रो स्प्रिंग" जैसी अच्छी पुस्तकों में पढ़ा जा सकता है।

निम्नलिखित URL मदद के भी हो सकते हैं।
http://static.springframework.org/docs/Spring-MVC-step-by-step/
http://en.wikipedia.org/wiki/Spring_Framework
http://www.theserverside.com/ttart/article/article .tss? एल = SpringFramework


5
स्प्रिंग में MVC फ्रेमवर्क होता है। लेकिन यह बहुत है, उससे बहुत अधिक है।
स्कैफ़मैन

बहुत ज्यादा नाइटपिक की इच्छा के बिना, WebMVC कोर स्प्रिंग डिस्ट्रो का हिस्सा है। वेबफ्लो, आरसीपी एट अल नहीं हैं।
कंकाल

1
यह अच्छा है, मुझे नहीं पता था कि आप जावा में टाइप इंटरफ़ेस के ऑब्जेक्ट्स को इंस्टेंट कर सकते हैं - जो कि अवैध है @skaffman इस उत्तर को समझने में मेरी मदद करें (देखें फोरव्हील का उदाहरण)
जोसी काल्डेरन

47

पुराने दिन, स्प्रिंग केवल एक निर्भरता इंजेक्शन फ्रेम वर्क की तरह था ( Guice , PicoContainer , ...), लेकिन आजकल यह आपके एंटरप्राइज एप्लिकेशन के निर्माण का कुल समाधान है ।

वसंत निर्भरता इंजेक्शन, जो, ज़ाहिर है, वसंत का दिल अभी भी है (और आप यहां अन्य अच्छे उत्तरों की समीक्षा कर सकते हैं), लेकिन वसंत से अधिक हैं ...

वसंत में अब बहुत सारी परियोजनाएँ हैं, प्रत्येक में कुछ उप-परियोजनाएँ हैं ( http://spring.io/projects ) हैं। जब कोई वसंत के बारे में बोलता है, तो आपको पता लगाना चाहिए कि वह किस वसंत परियोजना के बारे में बात कर रहा है, क्या यह केवल वसंत कोर है, जिसे वसंत ढांचे के रूप में जाना जाता है , या यह एक और वसंत परियोजना है।

कुछ वसंत परियोजनाएं जो बहुत उल्लेख के लायक हैं:

यदि आपको अपने आवेदन के लिए कुछ और निर्दिष्ट सुविधा की आवश्यकता है, तो आप इसे भी पा सकते हैं:

  • स्प्रिंग बैच बैच फ्रेमवर्क को
    बैच एप्लिकेशन के विकास को सक्षम करने के लिए डिज़ाइन किया गया है
  • वसंत हेटोसHATEOAS प्रिंसिपल के आधार पर REST API का आसान निर्माण
  • स्प्रिंग मोबाइल औरमोबाइल एप्लीकेशन डेवलपमेंट के लिए स्प्रिंग एंड्रियोड
  • स्प्रिंग शैल एक पूर्ण विशेषताओं वाले शेल (उर्फ कमांड लाइन) अनुप्रयोग का निर्माण करता है
  • क्लाउड एप्लिकेशन के लिए स्प्रिंग क्लाउड और स्प्रिंग क्लाउड डेटा फ्लो

उदाहरण के लिए वसंत-सामाजिक-फेसबुक ( http://projects.spring.io/spring-social-facebook/ ) के लिए कुछ छोटे प्रोजेक्ट भी हैं

आप वेब विकास के लिए वसंत का उपयोग कर सकते हैं क्योंकि इसमें Spring MVCमॉड्यूल है जो स्प्रिंग फ्रेमवर्क परियोजना का हिस्सा है । या आप स्ट्रट्स 2 की तरह वसंत का उपयोग किसी अन्य वेब फ्रेमवर्क के साथ कर सकते हैं ।


1
मैं वास्तव में mvc, डेटा, jpa और स्प्रिंग के अन्य भागों को देखना चाहता हूं, जिसमें स्प्रिंग के कोर DI का उपयोग नहीं करने का विकल्प है, लेकिन Dagger को इसके बजाय स्प्रिंग के दिल में डाल दिया है।
dlamblin

25

वसंत के लिए क्या है? मैं उस प्रश्न का उत्तर शीघ्र ही दूंगा, लेकिन पहले, आइए एक और उदाहरण लेते हैं विजेता ह्यूगो द्वारा। यह एक महान उदाहरण नहीं है क्योंकि यह एक नए ढांचे की आवश्यकता को सही नहीं ठहराता है।

public class BaseView {
  protected UserLister userLister;

  public BaseView() {
    userLister = new UserListerDB(); // only line of code that needs changing
  }
}

public class SomeView extends BaseView {
  public SomeView() {
    super();
  }

  public void render() {
    List<User> users = userLister.getUsers();
    view.render(users);
  }
}

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

तो वसंत के लिए क्या है? इसके लिए है:

  1. ब्लाइंड डेवलपर्स जो झुंड का पालन करते हैं
  2. नियोक्ता जो कभी भी स्नातक प्रोग्रामर को नियुक्त नहीं करना चाहते हैं क्योंकि वे यूनी में ऐसे ढांचे को नहीं सिखाते हैं
  3. खराब डिजाइन और पैचवर्क के साथ शुरू होने वाली परियोजनाएं (जैसा कि विजेता ह्यूगो के उदाहरण द्वारा दिखाया गया है)

आगे पढ़े: http://discuss.joelonsoftware.com/?joel.3.219431.12


11
एक तरफ हताशा, मैं आपके तर्कों के बारे में सोच रहा हूं। मैं किसी भी प्रोग्रामिंग टूल को नहीं जानता जिसका उपयोग आप खराब डिज़ाइन का उत्पादन करने के लिए नहीं कर सकते। आप जो उद्देश्य रखते हैं, वह यह है कि फ्रेमवर्क का उपयोग करके आप खराब कोड को बहुत सारा सामान बना सकते हैं। यह सार्वभौमिक रूप से सत्य है और वसंत के लिए विशिष्ट नहीं है। नहीं तो बात क्या है? क्या आपको नहीं लगता है कि सक्षम डेवलपर्स स्प्रिंग का क्या उपयोग कर सकते हैं - जो कि उनके द्वारा उपयोग किए गए फ्रेमवर्क के विशेष टूल में विशेष रूप से उपयोग कर सकता है? कम से कम मैं काफी निश्चित हूं कि आप यह नहीं मानते हैं कि किसी भी स्प्रिंग डेवलपर ने कभी भी कक्षाओं का विस्तार नहीं किया है। आगे का पठन हालांकि प्रफुल्लित करने वाला है।
sthzg

2
इसके अलावा, आपका उदाहरण काम करता है क्योंकि दृश्य को केवल एक इंजेक्शन सेवा ( UserLister) की आवश्यकता होती है, लेकिन क्या होगा यदि इसे विभिन्न सेवाओं की जरूरत है, विभिन्न बच्चों के बीच साझा नहीं की जाती हैBaseView ? जावा में कोई सौभाग्य नहीं है (सौभाग्य से)।
एडवर्ड बर्थे

@EdouardBerthe मेला बिंदु। मेरा उत्तर DI की अवहेलना करने का प्रयास नहीं था, यह सिर्फ इस बात का उदाहरण देता है कि स्वीकृत उत्तर में दिखाया गया उदाहरण सबसे बड़ा नहीं है; परिदृश्य जो आप प्रस्तावित कर रहे हैं वह सबसे बेहतर काम करेगा। जिस बिंदु पर मैं वास्तव में प्रयास कर रहा था, वह यह नहीं है कि आपको DI की आवश्यकता नहीं है, बल्कि आपको इसे करने के लिए संपूर्ण ढांचे की आवश्यकता नहीं है।
ऐश

19

बहुत संक्षेप में, मैं कहूंगा कि वसंत आपके आवेदन में "गोंद" है। इसका उपयोग विभिन्न रूपरेखाओं और अपने स्वयं के कोड को एकीकृत करने के लिए किया जाता है।


15

वसंत तीन चीजें हैं।

  1. स्प्रिंग डिपेंडेंसी इंजेक्शन को संभालता है और मैं आपको निर्भरता इंजेक्शन पर मार्टिन फाउलर के उत्कृष्ट परिचय को पढ़ने की सलाह देता हूं।
  2. दूसरी बात यह है कि स्प्रिंग अपने अनुप्रयोगों में उपयोग करने के लिए उत्कृष्ट रूप से उत्कृष्ट पुस्तकालयों को लपेटता है। एक अच्छे उदाहरण के लिए देखें कि स्प्रिंग टास्क एक्सक्यूसर्स और क्वार्ट्ज शेड्यूलर को कैसे लपेटता है।
  3. तीसरा स्प्रिंग REST, MVC वेब फ्रेमवर्क और अन्य जैसे वेब सामान के कार्यान्वयन का एक गुच्छा प्रदान करता है। जब से आप पहले दो के लिए स्प्रिंग का उपयोग कर रहे हैं, तब तक वे समझ सकते हैं, हो सकता है कि आप इसे अपने वेब ऐप की जरूरत की हर चीज के लिए उपयोग कर सकें।

समस्या यह है कि स्प्रिंग डीआई को वास्तव में अच्छी तरह से सोचा जाता है, अन्य चीजों के आसपास रैपर वास्तव में अच्छी तरह से सोचा जाता है कि अन्य चीजों ने सब कुछ सोचा और वसंत बस अच्छी तरह से इसे लपेटता है। MVC और REST और अन्य सभी सामानों का स्प्रिंग कार्यान्वयन उतना अच्छा नहीं किया गया है (YMMV, IMHO) लेकिन अपवाद हैं (Spring Security is da bomb)। इसलिए मैं DI के लिए स्प्रिंग, और इसके ठंडे आवरणों का उपयोग करता हूं लेकिन वेब के लिए अन्य सामान पसंद करता हूं (मुझे टेपेस्ट्री बहुत पसंद है), रेस्ट (जर्सी वास्तव में मजबूत है), आदि।


9
YMMV, IMHO - आपका माइलेज मई वैरी, इन माई हंबल ओपिनियन में आपमें से उन लोगों के लिए जो मेरे जैसे संक्षिप्तीकरण में पारंगत नहीं हैं ...
सकामोटो काजुमा

11

क्या आप शायद वसंत के साथ एक वेब अनुप्रयोग में चाहते हैं -

  • स्प्रिंग MVC, जो 2.5+ के साथ आपको POJO को नियंत्रक कक्षाओं के रूप में उपयोग करने की अनुमति देता है, जिसका अर्थ है कि आपको किसी विशेष ढांचे (स्ट्रट्स या स्प्रिंग प्री-2.5 के रूप में) से विस्तार करने की आवश्यकता नहीं है। निर्भरता इंजेक्शन के हिस्से में धन्यवाद परीक्षण के लिए नियंत्रक कक्षाएं भी सरल हैं
  • हाइबरनेट के साथ वसंत एकीकरण, जो उस ORM समाधान के साथ काम को सरल बनाने का एक अच्छा काम करता है (ज्यादातर मामलों के लिए)
  • वेब ऐप के लिए स्प्रिंग का उपयोग करना आपको एप्लिकेशन के सभी स्तरों पर अपने डोमेन ऑब्जेक्ट का उपयोग करने में सक्षम बनाता है - वही कक्षाएं जो हाइबरनेट का उपयोग करके मैप की जाती हैं, वे कक्षाएं हैं जिन्हें आप "फॉर्म बीन्स" के रूप में उपयोग करते हैं। स्वभाव से, यह अधिक मजबूत डोमेन मॉडल का हिस्सा होगा, क्योंकि यह कक्षाओं की संख्या में कटौती करने जा रहा है।
  • स्प्रिंग फॉर्म टैग बहुत परेशानी के बिना फॉर्म बनाने में आसान बनाते हैं।

इसके अलावा, स्प्रिंग बहुत बड़ा है - इसलिए कई अन्य चीजें हैं जिन्हें आप वेब ऐप जैसे स्प्रिंग एओपी या स्प्रिंग सिक्योरिटी में उपयोग करने में रुचि रखते हैं। लेकिन ऊपर सूचीबद्ध चार चीजें स्प्रिंग के सामान्य घटकों का वर्णन करती हैं जो एक वेब ऐप में उपयोग की जाती हैं।


9

मुझे इसके दो भाग दिखाई देते हैं:

  1. "वास्तव में वसंत के लिए क्या है" -> विजेता ह्यूगो द्वारा स्वीकृत उत्तर देखें।
  2. "[...] स्प्रिंग वेब विकास के लिए एक अच्छा ढांचा है" -> यह कहते हुए लोग स्प्रिंग एमवीसी के बारे में बात कर रहे हैं। स्प्रिंग एमवीसी वसंत के कई हिस्सों में से एक है, और यह एक वेब फ्रेमवर्क है जो वसंत की सामान्य विशेषताओं का उपयोग करता है, जैसे कि निर्भरता इंजेक्शन। यह एक बहुत सामान्य संरचना है कि यह बहुत ही विन्यास योग्य है: आप विभिन्न db परतों (हाइबरनेट, iBatis, सादे JDBC), विभिन्न दृश्य परतों (JSP, वेग, फ्रीमार्कर ...) का उपयोग कर सकते हैं

ध्यान दें कि आप स्प्रिंग एमवीसी का उपयोग किए बिना वेब एप्लिकेशन में स्प्रिंग का पूरी तरह से उपयोग कर सकते हैं। मैं कहूंगा कि अधिकांश जावा वेब एप्लिकेशन ऐसा करते हैं, जबकि अन्य वेब फ्रेमवर्क जैसे कि विकेट, स्ट्रट्स, सीम, ...


8

वसंत एक साथ कक्षाओं के gluing उदाहरणों के लिए महान है। आप जानते हैं कि आपके हाइबरनेट वर्गों को हमेशा एक डेटा स्रोत की आवश्यकता होती है, स्प्रिंग उन्हें एक साथ जोड़ते हैं (और डेटा स्रोत का एक कार्यान्वयन होता है)।

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

इसके अतिरिक्त, स्प्रिंग मूल रूप से आपको पुस्तकालयों के एक समूह का ठोस विन्यास प्रदान करता है, और इसमें आपको यह मार्गदर्शन देता है कि आपको किन कार्यों का उपयोग करना चाहिए।

वसंत वास्तव में एक महान उपकरण है। (मैं स्प्रिंग MVC, बस आधार ढांचे के बारे में बात नहीं कर रहा था)।


5

स्वीकृत उत्तर में एनोटेशन उपयोग शामिल नहीं है क्योंकि स्प्रिंग ने कॉन्फ़िगरेशन के लिए विभिन्न एनोटेशन के लिए समर्थन पेश किया था।

वसंत (निर्भरता इंजेक्शन) दृष्टिकोण

XML फ़ाइल का उपयोग करके कक्षाओं को तार करने का एक और तरीका है: एनोटेशन। के स्वीकार किए जाते हैं जवाब से उदाहरण का उपयोग करते हैं और सीधे सेम रजिस्टर वर्ग एनोटेशन में से एक का उपयोग करने पर @Component, @Service, @Repositoryया @Configuration:

@Component
public class UserListerDB implements UserLister {
    public List<User> getUsers() {
        // DB access code here
    }
}

इस तरह से जब दृश्य बनाया जाता है तो यह काम करने के लिए तैयार उपयोगकर्ता के पास होगा।

उपरोक्त कथन किसी भी XML फ़ाइल के उपयोग की कोई आवश्यकता नहीं है और एक अन्य एनोटेशन के साथ वायरिंग के साथ मान्य है @Autowiredजो एक प्रासंगिक कार्यान्वयन पाता है और इसे इंजेक्ट करता है।

@Autowired
private UserLister userLister;

@Beanइंजेक्शन लगाने के लिए सेम कार्यान्वयन प्राप्त करने के लिए उपयोग की जाने वाली विधि पर एनोटेशन का उपयोग करें ।


गलत। आप @Beanवर्ग स्तर पर एनोटेशन का उपयोग नहीं कर सकते । से एक होना चाहिए @Component, @Service, @Repositoryआदि बाकी सही है। आपको शायद यह भी इंगित करना चाहिए कि इंटरफ़ेस को इस तरह से ऑटो करना केवल तभी काम करेगा जब क्लासपाथ में केवल 1 उम्मीदवार वर्ग इंजेक्शन के लिए उपयुक्त हो, अन्यथा स्प्रिंग एप्लिकेशन त्रुटि।
स्टेफानो एल

@StefanoL: हाँ, आप सही हैं। मुझे आश्चर्य है कि लोगों ने मेरी गलती को नजरअंदाज किया। टिप्पणी के लिए धन्यवाद।
निकोलस

4

लाभ निर्भरता इंजेक्शन (DI) है । इसका मतलब है कि वस्तु निर्माण के कार्य को आउटसोर्स करना। मुझे एक उदाहरण के साथ समझाएं।

public interface Lunch
{
   public void eat();
}

public class Buffet implements Lunch
{
   public void eat()
   {
      // Eat as much as you can 
   }
}

public class Plated implements Lunch
{
   public void eat()
   {
      // Eat a limited portion
   }
}

अब मेरे कोड में मेरे पास निम्न के रूप में एक वर्ग दोपहर का भोजन है:

public class LunchDecide {
    private Lunch todaysLunch;
    public LunchDecide(){
        this.todaysLunch = new Buffet(); // choose Buffet -> eat as much as you want
        //this.todaysLunch = new Plated(); // choose Plated -> eat a limited portion 
    }
}

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

public class LunchDecide {
    private Lunch todaysLunch;
    public LunchDecide(Lunch todaysLunch){
        this.todaysLunch = todaysLunch
        }
    }

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


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

@ArpanBuch मुझे लगता है कि वसंत का लाभ यह है कि आप किसी भी कोड को फिर से जमा किए बिना एक अलग कार्यान्वयन चुन सकते हैं (इसलिए जब तक कि अन्य कार्यान्वयन पहले से मौजूद नहीं है)। मैं एक शुरुआती हूं, इसलिए मैं गलत हो सकता हूं।
byxor

4
  • स्प्रिंग J2EE की तुलना में एक हल्का और लचीला ढांचा है।
  • स्प्रिंग कंटेनर नियंत्रण के विलोम के रूप में कार्य करता है।
  • स्प्रिंग AOP यानी प्रॉक्सी और सिंग्लटन, फ़ैक्टरी और टेम्प्लेट मेथड डिज़ाइन पैटर्न का उपयोग करता है।
  • Tiered आर्किटेक्चर: चिंताओं और पुन: प्रयोज्य परतों और आसान रखरखाव की जुदाई।

यहाँ छवि विवरण दर्ज करें


1
Spring Framework help you with several things like, don't reinvent the wheel. you can connect very easily with some database just using Spring Data, or create schedule tasks like CronJob or Windows Task. amazing !
tomj0101

3

स्प्रिंग एंटरप्राइज जावाबीन (EJB) तकनीक का एक अच्छा विकल्प है । इसमें वेब फ्रेमवर्क और वेब सर्विसेज फ्रेमवर्क घटक भी है।


1
क्या मैं सही कर सकता हूँ? था करने के लिए (भयानक) EJB 2 ... लगता है "नए EJB" (भाग में, जेपीए 2, आदि) स्वीकृति grooving है विकल्प। वसंत भाग के "हैप्पी आवर्स" "ईजेबी का एक प्रकार" अतीत लगता है। विज्ञापन २०१५
जसक सीज़

1

वसंत एक काफी सरल निर्भरता इंजेक्शन प्रणाली के रूप में शुरू हुआ। अब यह बहुत बड़ा है और इसमें सब कुछ है (लौकिक रसोई सिंक को छोड़कर)।

लेकिन डर नहीं, यह काफी मॉड्यूलर है इसलिए आप अपने इच्छित टुकड़ों का उपयोग कर सकते हैं।

यह देखने के लिए कि यह सब कहाँ शुरू हुआ:

http://www.amazon.com/Expert-One-Design-Development-Programmer/dp/0764543857/ref=sr_1_1?ie=UTF8&s=books&qid=1246374863&sr=1-1

यह पुराना हो सकता है लेकिन यह एक उत्कृष्ट पुस्तक है।

एक और अच्छी किताब के लिए इस बार विशेष रूप से वसंत दर्शन के लिए समर्पित:

http://www.amazon.com/Professional-Java-Development-Spring-Framework/dp/0764574833/ref=sr_1_2?ie=UTF8&s=books&qid=1246374863&sr=1-2

यह स्प्रिंग के पुराने संस्करणों को भी संदर्भित करता है लेकिन निश्चित रूप से देखने लायक है।


1

भीख में वसंत निर्भरता इंजेक्शन था, फिर लगभग हर चीज के लिए रैपर के राजा को जोड़ें (जेपीए कार्यान्वयन आदि पर आवरण)।

लंबी कहानी ... स्प्रिंग प्रीफ़र के अधिकांश भाग एक्सएमएल समाधान (एक्सएमएल स्क्रिप्टिंग इंजन ... ब्र्र्र्र), इसलिए डि के लिए मैं गाइस का उपयोग करता हूं

अच्छी लाइब्रेरी, लेकिन बढ़ते डिपेंडेंसिएक के साथ, उदाहरण के लिए स्प्रिंग जेडीबीसी (शायद असली नामों के मापदंडों के साथ एक जावा जेडडीबीसी समाधान) अगले 4-5 मावेन से लेते हैं।

वेब विकास के लिए स्प्रिंग एमवीसी ("बड़े वसंत का हिस्सा") का उपयोग करना ... यह "अनुरोध आधारित" रूपरेखा है, पवित्र युद्ध "अनुरोध बनाम घटक" है ... आपके ऊपर


1
मेरा मानना ​​है कि अब स्प्रिंग फ्रेमवर्क XML से एनोटेशन और जावा कॉन्फ़िगरेशन से दूर जाने की कोशिश कर रहा है।
Maksim

0

अतीत में मैंने विशुद्ध रूप से तकनीकी दृष्टिकोण से स्प्रिंग ढांचे के बारे में सोचा था।

टीम के काम से कुछ अनुभव और विकासशील उद्यम वेब ऐप्लिकेशन को देखते हुए - मैं कहूँगा कि वसंत के लिए है आवेदनों की तेजी से विकास द्वारा (वेब अनुप्रयोगों) decoupling अपनी अलग-अलग तत्वों (बीन्स)। तेज़ विकास इसे इतना लोकप्रिय बनाता है। स्प्रिंग, स्प्रिंग फ्रेमवर्क पर एप्लिकेशन के निर्माण (वायरिंग) की जिम्मेदारी को स्थानांतरित करने की अनुमति देता है। स्प्रिंग फ्रेमवर्क की निर्भरता इंजेक्शन व्यक्तिगत बीन्स को एक कार्यशील अनुप्रयोग में जोड़ने / वायरिंग के लिए जिम्मेदार है।

इस तरह से डेवलपर्स को व्यक्तिगत घटकों (बीन्स) के विकास पर अधिक ध्यान केंद्रित किया जा सकता है जैसे ही बीन्स के बीच इंटरफेस को परिभाषित किया जाता है।

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

स्प्रिंग ढांचे जैसे कई विशेष सेम को परिभाषित करता है @Controller ( @Restcontroller ), @Repository , @Component वेब प्रयोजनों की सेवा करने के लिए। मावेन के साथ वसंत एक संरचना प्रदान करता है जो डेवलपर्स के लिए सहज है। टीम का काम आसान और तेज़ है क्योंकि व्यक्तिगत तत्वों को अलग रखा गया है और उनका पुन: उपयोग किया जा सकता है।


0

वसंत ढांचा निश्चित रूप से वेब विकास के लिए अच्छा है और बाकी एपी सेवाओं के लिए अधिक विशिष्ट है।

इसकी निर्भरता इंजेक्शन और वसंत सुरक्षा , स्प्रिंग अनूप , पीवीसी फ्रेमवर्क , माइक्रोसर्विस जैसे अन्य मॉड्यूल के साथ एकीकरण के कारण यह ऊपर के लिए अच्छा है

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

यदि आपके एप्लिकेशन में बहुत अधिक ट्रैफ़िक है, तो इस तरह से लोड बढ़ रहा है, तो आपको माइक्रोसर्विस कॉन्सेप्ट का उपयोग करने की आवश्यकता है।

वसंत इन सभी सुविधाओं को एक मंच में दे रहा है। कई मॉड्यूल के साथ समर्थन ।
सबसे महत्वपूर्ण, वसंत खुला स्रोत और एक एक्स्टेंसिबल फ्रेमवर्क है, जीवन चक्र में कस्टम कोड को एकीकृत करने के लिए हर जगह एक हुक है।

स्प्रिंग डेटा एक परियोजना है जो आपकी परियोजना के साथ एकीकरण प्रदान करती है।


तो वसंत लगभग हर आवश्यकता में फिट हो सकता है।

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