java - वसंत फ्रेमवर्क वास्तव में क्या है?




spring web (12)

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

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

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

इस तरह के आवेदन का परीक्षण आसान है - प्राथमिक ध्यान व्यक्तिगत सेम को दिया जाता है। उन्हें आसानी से decoupled और मजाक किया जा सकता है, तो इकाई परीक्षण तेजी से और कुशल है।

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

मैं Spring बारे में बहुत कुछ सुनता हूं, लोग पूरे वेब पर कह रहे हैं कि वसंत वेब विकास के लिए एक अच्छा ढांचा है। वसंत फ्रेमवर्क वास्तव में क्या है? मैं अपने वेब-जावा एप्लिकेशन विकास के लिए इसका उपयोग कैसे कर सकता हूं? कोई उदाहरण?


असल में वसंत dependency-injection लिए एक ढांचा है जो एक पैटर्न है जो बहुत decoupled सिस्टम बनाने की अनुमति देता है।

समस्या

उदाहरण के लिए, मान लीजिए कि आपको सिस्टम के उपयोगकर्ताओं को सूचीबद्ध करने की आवश्यकता है और इस प्रकार उपयोगकर्ता 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();

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

UserLister userLister = new UserListerCommaSeparatedFile();

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

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

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

वसंत में उदाहरण पर वापस जाकर हमें userLister फ़ील्ड के लिए एक userLister और इस तरह एक एक्सएमएल होना चाहिए:

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

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

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

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

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

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

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

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


पुराने दिन, बसंत एक निर्भरता इंजेक्शन फ्रेम काम था ( गुइस , पिकोकॉन्टेनर , ...), लेकिन अब एक दिन यह आपको एंटरप्राइज़ एप्लिकेशन बनाने के लिए कुल समाधान है।

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

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

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

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

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

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

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


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


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

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
        }
    }

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


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

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

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

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

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


वसंत ढांचा वेब विकास के लिए आराम से अच्छा है एपीआई के लिए अधिक विशिष्ट। यह इसके निर्भरता इंजेक्शन और वसंत सुरक्षा , वसंत एओपी , एमवीसी ढांचे , microservices जैसे अन्य मॉड्यूल के साथ एकीकरण के कारण है

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

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

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

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


तो आवेदन बनाने के लिए आपको जो कुछ भी चाहिए, वह वसंत है।


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

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

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



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

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;
}

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

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

इसे नियंत्रण में उलटा भी कहा जाता है। ऐसा करने के लिए अन्य ढांचे हैं Google guice, पिको कंटेनर इत्यादि।

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

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

निम्नलिखित यूआरएल भी मदद की जा सकती है।
http://static.springframework.org/docs/Spring-MVC-step-by-step/
http://en.wikipedia.org/wiki/Spring_Framework
http://www.theserverside.com/tt/articles/article.tss?l=SpringFramework


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

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

एक एक्सएमएल फ़ाइल का उपयोग करने के साथ कक्षाओं को तार करने का एक और तरीका: एनोटेशन। आइए स्वीकार किए गए उत्तर से उदाहरण का उपयोग करें और एनोटेशन @ कॉम्पोनेंट , @ सेवा , @ रिपोजिटरी or @ कॉन्फ़िगरेशन` का उपयोग करके सीधे बीन को कक्षा में पंजीकृत करें:

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

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

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

@Autowired
private UserLister userLister;

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


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





frameworks