निर्भरता इंजेक्शन के लिए Google Guice बनाम PicoContainer


100

मेरी टीम निर्भरता इंजेक्शन रूपरेखा पर शोध कर रही है और Google-Guice और PicoContainer का उपयोग करने के बीच निर्णय लेने की कोशिश कर रही है।

हम अपने ढांचे में कई चीजों की तलाश कर रहे हैं:

  1. एक छोटा कोड पदचिह्न - एक छोटे कोड पदचिह्न से मेरा मतलब है कि हम अपने कोड आधार में हर जगह निर्भरता इंजेक्शन कोड कूड़े नहीं रखना चाहते हैं। यदि हमें सड़क को कम करने की आवश्यकता है, तो हम चाहते हैं कि यह यथासंभव आसान हो।
  2. प्रदर्शन - वस्तुओं को बनाते और इंजेक्ट करते समय प्रत्येक ढांचे में कितना ओवरहेड होता है?
  3. उपयोग में आसानी - क्या एक बड़ी सीखने की अवस्था है? क्या हमें कुछ सरल काम करने के लिए कोड के टीले लिखना होगा? हम जितना संभव हो उतना कम कॉन्फ़िगरेशन चाहते हैं।
  4. सामुदायिक आकार - बड़े समुदायों का आमतौर पर मतलब है कि एक परियोजना को बनाए रखा जाएगा। हम किसी फ्रेमवर्क का उपयोग नहीं करना चाहते हैं और हमें अपने स्वयं के बग्स को ठीक करना है;) साथ ही हमारे पास किसी भी प्रश्न का उत्तर फ्रेमवर्क के डेवलपर / उपयोगकर्ता समुदाय द्वारा दिया जा सकता है (उम्मीद है)।

सूचीबद्ध मानदंडों के खिलाफ दो रूपरेखाओं की तुलना की बहुत सराहना की जाएगी। कोई भी व्यक्तिगत अनुभव जो दोनों की तुलना करने में मदद करता है वह भी बेहद मददगार होगा।

डिस्क्लेमर: मैं निर्भरता इंजेक्शन के लिए काफी नया हूं इसलिए मेरे नॉब-नेस को बहाना अगर मैंने एक सवाल पूछा जो इस चर्चा के लिए उचित नहीं है।


अपडेट: आप CDI 2.0 - कॉन्सेप्ट्स और डिपेंडेंसी इंजेक्शन के लिए भी विचार कर सकते हैं । 2017-04 के रूप में JSR 365 में मानकीकृत।
बेसिल बोर्के

जवाबों:


115

आप अपने द्वारा निर्भर किए जा रहे डिपेंडेंसी इंजेक्शन फ्रेमवर्क की अपनी सूची में स्प्रिंग को शामिल करना चाह सकते हैं। यहां आपके सवालों के जवाब दिए गए हैं:

ढांचे के लिए युग्मन

पिको - पिको सेटर इंजेक्शन को हतोत्साहित करता है, लेकिन इसके अलावा, आपकी कक्षाओं को पिको के बारे में जानने की आवश्यकता नहीं है। यह केवल वायरिंग है जिसे जानना आवश्यक है (सभी DI फ्रेमवर्क के लिए सही)।

Guice - Guice अब मानक JSR 330 एनोटेशन का समर्थन करता है , इसलिए अब आपको अपने कोड में Guice के विशिष्ट एनोटेशन की आवश्यकता नहीं है। स्प्रिंग इन मानक एनोटेशन का भी समर्थन करता है। यह तर्क कि Guice लोग उपयोग करते हैं, एक Guice एनोटेशन प्रोसेसर के बिना चल रहा है, इनका प्रभाव नहीं होना चाहिए यदि आप एक अलग फ्रेमवर्क का उपयोग करने का निर्णय लेते हैं।

स्प्रिंग - स्प्रिंग का उद्देश्य है कि आप अपने कोड में स्प्रिंग फ्रेमवर्क के किसी भी उल्लेख से बचने की अनुमति दें। क्योंकि उनके पास बहुत से अन्य सहायक / उपयोगिताएँ आदि हैं, हालांकि प्रलोभन स्प्रिंग कोड पर निर्भर करने के लिए बहुत मजबूत है, हालांकि।

प्रदर्शन

पिको - मैं पिको की गति विशेषताओं से बहुत परिचित नहीं हूं

Guice - Guice को तेजी से डिजाइन किया गया था और संदर्भ में वर्णित तुलना में कुछ संख्याएँ हैं। निश्चित रूप से अगर गति एक प्राथमिक विचार है तो या तो Guice या हाथ से वायरिंग का उपयोग किया जाना चाहिए

वसंत - वसंत धीमा हो सकता है। इसे तेजी से बनाने के लिए काम किया गया है और JavaConfig लाइब्रेरी का उपयोग करके चीजों को गति देना चाहिए।

उपयोग में आसानी

पिको - कॉन्फ़िगर करने के लिए सरल। पिको आपके लिए कुछ ऑटोवेयर निर्णय ले सकता है। यह स्पष्ट नहीं है कि यह बहुत बड़ी परियोजनाओं को कैसे मापता है।

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

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

सामुदायिक आकार

पिको - छोटा

गिटार - मध्यम

वसंत - बड़ा

अनुभव

पिको - मुझे पिको के साथ बहुत अनुभव नहीं है, लेकिन यह व्यापक रूप से उपयोग की जाने वाली रूपरेखा नहीं है, इसलिए यह संसाधनों को खोजने में कठिन होगा।

Guice - Guice एक लोकप्रिय ढाँचा है और इसकी गति पर ध्यान देने का स्वागत है जब आपको एक बड़ी परियोजना मिली है जिसे आप विकास में पुनः आरंभ कर रहे हैं। मुझे कॉन्फ़िगरेशन की वितरित प्रकृति के बारे में चिंता है, अर्थात यह देखना आसान नहीं है कि हमारे पूरे आवेदन को एक साथ कैसे रखा जाए। यह इस संबंध में AOP जैसा है।

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

संदर्भ


1
मैंने जो सीखा (किसी और के बजाय खुद इसे इस्तेमाल करने से) वह है PicoContainer, Guice की तुलना में अधिक हल्का वजन है। इसके अलावा, हालांकि PicoContainer doc यह भी उपयोग करने के लिए सरल प्रतीत होता है। यह स्वयं कन्स्ट्रक्टरों पर निर्भरता की खोज करेगा और आपको यह निर्दिष्ट करने की आवश्यकता नहीं है कि किस कंस्ट्रक्टर का उपयोग करना है। यह सिर्फ एक मेल का उपयोग करता है।
Kissaki

2
हाँ, मैं खुद अब PicoContainer पर बड़ा हूँ। यह सिर्फ एक ऐसा "इसे सरल रखें" है, फिर भी काम कर रहा समाधान, मैं मदद नहीं कर सकता लेकिन आजकल के रूप में फूला हुआ और पुराना दिख रहा हूं। Guice भी अच्छा है (और एक अच्छा backer w / Google है), लेकिन मेरा मानना ​​है कि पिको में भी अधिक विशेषताएं / लचीलापन है, जो अधिक पुराना है। यह अच्छा करने के लिए अच्छा विकल्प देखने के लिए अच्छा है xml विन्यास!
मैनियस

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

1
मैं बहुत बड़ी (और भारी उपयोग) परियोजनाओं (प्रत्येक कंटेनर में परिभाषित सैकड़ों घटक प्रकार) की एक संख्या में पिको का उपयोग करता हूं, और इसकी सभी विभिन्न विशेषताओं का उपयोग करता हूं, और इसके साथ खुश नहीं हो सकता।
21

2
मैंने सिर्फ एक सरल प्रदर्शन परीक्षण किया जिसमें Guice / Spring / PicoContainer - Guice और PicoContainer काफी समान हैं। कुछ मामलों में Guice थोड़ा तेज़ था। सभी मामलों में वसंत बहुत धीमा था।
जोशुआ डेविस

25

जैमी.mccrindle द्वारा दिया गया उत्तर वास्तव में बहुत अच्छा है, लेकिन मैं उलझन में हूं कि स्प्रिंग डिफ़ॉल्ट विकल्प क्यों है जब यह बहुत स्पष्ट है कि बेहतर विकल्प (पिको और गाइस दोनों) उपलब्ध हैं। IMO स्प्रिंग की लोकप्रियता चरम पर पहुंच गई है और अब यह वर्तमान में उत्पन्न हाइप से दूर रह रही है (अन्य सभी "मुझे भी" स्प्रिंग सब प्रोजेक्ट्स जो स्प्रिंग बैंडवैगन की सवारी करने के लिए देख रहे हैं)।

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

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

कभी-कभी कुछ अच्छा (पिको / गाइस) बनाना और फिर अपने नए और नए सिंक के साथ ब्लॉट और किचन सिंक के फीचर्स को जोड़ने के बजाए इसे अपने ऑफर्स को रखना वास्तव में कारगर साबित होता है ...


1
यह कहने की परवाह करें कि पिको और गाइस स्प्रिंग से बेहतर क्यों हैं?
थोरबजोरन रावन एंडरसन

4
मुझे लगा कि मैंने किया - मूल रूप से, वे डीआई भी करते हैं, वे सरल / छोटे / क्लीनर हैं, और कुछ या कुछ निर्भरताएं नहीं हैं। यह कहने के लिए नहीं है कि स्प्रिंग कभी भी समझ में नहीं आता (मुझे यकीन है कि मामले हैं), मैं कह रहा हूं कि आपकी आवश्यकताओं को पूरा किया जा रहा है तो सरल बेहतर है। और बहुत बड़ी संख्या में प्रोजेक्ट्स के लिए, छोटे सपोर्ट लिबास आप सभी की जरूरत है।
मैनियस

12

नोट: यह एक उत्तर से अधिक टिप्पणी / शेख़ी का है

PicoContainer महान है। अगर वे सिर्फ अपनी वेब साइटों को ठीक करते हैं तो मैं इसे वापस स्विच करूँगा। यह वास्तव में अब भ्रामक है:

  • http://picocontainer.com जो सबसे हाल का है, लेकिन कई पृष्ठों में प्रारूपण मुद्दे हैं और कुछ पृष्ठ बिल्कुल भी काम नहीं करते हैं। ऐसा लगता है कि पृष्ठ पुरानी सामग्री से स्वतः परिवर्तित थे।
  • http://picocontainer.codehaus.org/ जो संस्करण २.१०.२ में समय पर जमे हुए लगता है - यह वास्तव में अच्छा होगा यदि पृष्ठों ने कुछ ऐसा कहा "अरे, तुम एक पुरानी वेब साइट देख रहे हो!"
  • http://docs.codehaus.org/display/PICO/Home - एक संगम विकि जो दस्तावेज़ v 1.x है, लेकिन यह पृष्ठ पर कहीं भी यह नहीं कहता है!

मैं अब भी बड़ा होने के बावजूद 2.x का उपयोग कर रहा हूं, और इसमें कम विशेषताएं हैं। प्रलेखन खोजना बहुत आसान था, और यह उपयोगकर्ता समूह बहुत सक्रिय है। हालाँकि, अगर Guice 3 की दिशा कोई संकेत है, तो ऐसा लगता है कि Guice फूलने लगा है, जैसे वसंत ने शुरुआती दिनों में वापसी की थी।

अद्यतन: मैंने पिको कंटेनर लोगों के लिए एक टिप्पणी पोस्ट की और उन्होंने वेब साइट पर कुछ सुधार किए हैं। अब काफ़ी बेहतर!


लेकिन codehaus वेबसाइट अभी भी जमी है और किसी भी कदम के बारे में कोई जानकारी नहीं है। मुझे लगा कि पिको मर चुका है;)
व्लादिस्लाव रैस्ट्रुसनी

1
यदि वेबसाइट कोड के साथ अद्यतित नहीं है, तो यह एक संकेत हो सकता है कि परियोजना महत्वपूर्ण द्रव्यमान से नीचे गिर गई है।
थोरबजोरन रेव एंडरसन

@ थोरबजोरन रावणअंडरसेन हां। दुर्भाग्य से मुझे लगता है कि पिको को गुइसे और सीडीआई द्वारा सुपरसीड किया गया है।
जोशुआ डेविस

5
8 मार्च 2013 तक, picocontainer.org वेबसाइट एक डोमेन स्क्वैटर के कब्जे में दिखाई देती है। picocontainer.com अब विहित वेबसाइट प्रतीत होता है।
dOxxx

2

यह एक पुराना प्रश्न है लेकिन आज आप अपने Android App प्रोजेक्ट में Dagger ( https://github.com/square/dagger ) पर विचार कर सकते हैं । संकलन समय पर डैगर कोड जनरेशन करता है। इसलिए आपको निष्पादन समय पर एक छोटा स्टार्टअप समय और कम मेमोरी उपयोग मिलता है।


मुझे डैगर पसंद है, लेकिन ऐसा लगता है कि अभी तक गैर-एंड्रॉइड प्रोजेक्ट के लिए पब्लिक रिपॉज में ग्रैडल प्लगइन नहीं है (यानी 'रेगुलर' जावा प्रोजेक्ट्स के लिए ग्रैडल प्लगइन)। अगर पब्लिक रिपॉजिट में कोई प्लगइन होता तो मैं इसे जावा प्रोजेक्ट्स के लिए मानता।
जोशुआ डेविस

2

यदि आप मिनिमलिस्टिक डि कंटेनर के बाद हैं, तो आप फेदर की जांच कर सकते हैं । वेनिला JSR-330 DI कार्यक्षमता केवल, लेकिन पदचिह्न (16K, कोई निर्भरता) और प्रदर्शन के मामले में काफी अच्छा है। Android पर काम करता है।


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

@ग्रीन मैं देख रहा हूँ कि आप जिन्न में चले गए हैं। क्या आप कृपया पंख के उपयोग के अपने अनुभव साझा कर सकते हैं?
बीयरबियर

1
@beerBear पंख बहुत हल्का है और डीआई उपयोग के अधिकांश मामलों में उपयोग करना बहुत आसान है। हालाँकि जब से मैं एक फुलस्टैक एमवीसी ढांचे पर काम कर रहा हूं, मुझे एक समाधान की आवश्यकता है जो पूर्ण JSR330 कल्पना को लागू करे। इसलिए मैं जिनी में चला गया
गेलिन लुओ

@ग्रीन ने बेहतर समझ पाने के लिए आपके स्पष्टीकरण के पोस्ट की सराहना की।
बीअरबियर

0

हालाँकि मुझे सादगी पसंद है और यह निर्भरता में कमी है। मैं इसके बजाय सीडीआई का उपयोग करने की सलाह दूंगा क्योंकि यह जावा ईई मानक का हिस्सा है, इसलिए आपके पास कोई वेंडर लॉक-इन नहीं है।

घुसपैठ के संदर्भ में, यह मुख्य समस्या कंटेनर की आवश्यकता है और अपेक्षाकृत खाली META-INF / beans.xml फ़ाइल के उपयोग की आवश्यकता है (यह इंगित करने के लिए कि जार CDI का उपयोग कर रहा है) और एनोटेशन का उपयोग (हालांकि वे मानक हैं )

हल्के CDI कंटेनर का उपयोग मैं अपनी परियोजनाओं के लिए करता हूं, Apache Open Web Beans है। हालांकि यह पता लगाने में थोड़ा समय लगा कि एक साधारण ऐप (पिको के विपरीत) कैसे बनाया जाए जो इस तरह दिखता है।

public static void main(final String[] args) {
    final ContainerLifecycle lifecycle = WebBeansContext.currentInstance()
            .getService(ContainerLifecycle.class);
    lifecycle.startApplication(null);

    final BeanManager beanManager = lifecycle.getBeanManager();
    // replace Tester with your start up class
    final Bean<?> bean = beanManager.getBeans(Tester.class).iterator()
            .next();

    final Tester b = (Tester) lifecycle.getBeanManager().getReference(bean,
            Tester.class, beanManager.createCreationalContext(bean));
    b.doInit();
}

2
यदि आप अपने पुस्तकालय कोड में JSR-330 के साथ चिपके रहते हैं, तो आप कंटेनर विशिष्ट कोड को न्यूनतम रख सकते हैं।
थोरबजोरन रेव एंडरसन

आपको अभी भी अपने स्वचालित परीक्षण में कंटेनर विशिष्ट कोड की आवश्यकता है। हालांकि इसका मतलब यह नहीं है कि आपके वास्तविक कोड में आपके पास कंटेनर विशिष्ट कोड होगा (और आपको वैसे भी तब तक नहीं चाहिए जब तक कि आप अपना खुद का "मुख्य" चलाने की योजना नहीं बनाते हैं, जो एक ऐप में मैंने खुद के लिए लिखा था।
आर्किमिडीज ट्रेजानो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.