CDI और EJB की तुलना कैसे करें? इंटरेक्ट करती है?


106

मुझे यह समझने में कठिन समय मिल रहा है कि दोनों कैसे बातचीत करते हैं और उनके बीच की सीमा कहाँ है। क्या वे ओवरलैप करते हैं? क्या उनके बीच अतिरेक है?

मुझे पता है कि दोनों के साथ जुड़े एनोटेशन हैं, लेकिन मैं संक्षिप्त विवरण के साथ दोनों के लिए पूरी सूची नहीं ढूंढ सका हूं। सुनिश्चित नहीं हैं कि यह स्पष्ट करने में मदद करेगा कि वे कैसे भिन्न हैं या वे कहाँ ओवरलैप करते हैं।

वास्तव में सिर्फ भ्रमित। मैं (सोचता हूं कि) मैं EJB को अच्छी तरह से समझता हूं, मुझे लगता है कि मुझे यह समझने में मुश्किल समय आ रहा है कि CDI टेबल पर क्या लाता है और यह कैसे बढ़ाता है या बढ़ाता है जो EJB पहले से ही प्रदान करता है।


3
यह प्रश्न Google के "EJB CDI अंतर" खोज पर सबसे ऊपर है, लेकिन मुझे इसका जवाब stackoverflow.com/questions/13487987/ पर मिला
मैट फ़्रीके सेप

जवाबों:


50

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

@EJB EJBService ejbService;

तथा

@Inject EJBService ejbService;

यह आपको भ्रमित कर सकता है, लेकिन शायद यही एकमात्र चीज है जो ईजेबी और सीडीआई के बीच का सेतु है।

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

और क्या CDI प्रदान करता है ... उदाहरण के लिए, आप स्ट्रट्स 2 को MVC फ्रेमवर्क (केवल उदाहरण) के रूप में उपयोग करते हैं, और आप यहां तक ​​सीमित हैं, यहां तक ​​कि EJB 3.1 का उपयोग करके भी - आप @EJBस्ट्रट्स एक्शन में एनोटेशन का उपयोग नहीं कर सकते हैं , यह कंटेनर द्वारा प्रबंधित नहीं है। लेकिन जब आप Struts2-CDI प्लगइन जोड़ते हैं, तो आप @Injectएक ही चीज़ के लिए एनोटेशन लिख सकते हैं (इसलिए कोई और अधिक JNDI लुकअप नहीं)। इस तरह से यह ईजेबी पावर को बढ़ाता है, लेकिन जैसा कि मैंने पहले उल्लेख किया है, आप सीडीआई के साथ क्या इंजेक्ट करते हैं - इससे कोई फर्क नहीं पड़ता कि यह ईजेबी से संबंधित है या नहीं, और यह इसकी शक्ति है।

पुनश्च। उदाहरण के लिए अद्यतन लिंक


क्या @EJB और @ वास्तव में कार्यात्मक समतुल्य हैं? मुझे लगता है कि यह सीडीआई और जावा ईई के बाकी के कुछ सूपों के बीच इंजेक्शन विधियों का ओवरलैप था जिसने मुझे भ्रमित किया। अधिक पढ़ने से संकेत मिलता है कि एनोटेशन को संरेखित करने की उम्मीद है।
टिम

जब आप @ इंजेक्शन का उपयोग करते हैं, तो आप यह सुनिश्चित कर सकते हैं कि EJB के @ स्टेटलेस या किसी अन्य सर्वर साइड कंपोनेंट का उपयोग कंटेनर द्वारा प्रस्तुत पूलिंग या कंसीडर जैसी सुविधाओं का उपयोग करना है। मुझे आशा है कि यह सीडीआई द्वारा प्रस्तुत नहीं किया गया है?
बाला

1
@ बाला: CDI पूलिंग की पेशकश नहीं करता ... EJB3.1 के साथ या उसके बिना CDI को देखें , आशा है कि यह आपके प्रश्न का उत्तर देता है ..
Maxym

@KorayTugay: CDI एक जावा ईई सुविधा है, इसलिए किसी भी जावा EE 6 अनुरूप सर्वर में यह है (ग्लासफिश 3.0.1+ गलत नहीं है, JBoss 6+ आदि) आप एक संदर्भ CDI कार्यान्वयन JBoss वेल्ड पर एक नज़र डाल सकते हैं। उदाहरण के लिए टॉमकैट ... में उपयोग कर सकते हैं
मैक्सिमम

191

यह वर्तमान में वास्तव में थोड़ा भ्रमित है क्योंकि जावा ईई में अब कई घटक मॉडल हैं। वे CDI , EJB3 और JSF प्रबंधित बीन्स हैं

सीडीआई ब्लॉक पर नया बच्चा है। सीडीआई बीन्स सुविधा dependency injection, scopingऔर ए event bus। CDI बीन्स इंजेक्शन और स्कूपिंग के संबंध में सबसे लचीली हैं। इवेंट बस बहुत ही हल्की होती है और वेब एप्लिकेशनों के लिए भी सबसे उपयुक्त होती है। इसके अतिरिक्त, CDI एक बहुत ही उन्नत सुविधा भी कहलाती है portable extensions, जो कि जावा EE को अतिरिक्त कार्यक्षमता प्रदान करने के लिए विक्रेताओं के लिए एक प्रकार का प्लग-इन तंत्र है, जो सभी कार्यान्वयनों पर उपलब्ध कराया जा सकता है (ग्लासफ़िश, JBoss एएस, वेबस्पेयर, आदि) ।

EJB3 बीन्स को पुराने विरासत EJB2 घटक मॉडल * से हटा दिया गया था और एक एनोटेशन के माध्यम से सेम प्रबंधित करने के लिए जावा ईई में पहली सेम थी। EJB3 सेम की सुविधा dependency injection, declarative transactions, declarative security , pooling, concurrency control, asynchronous executionऔर remoting

EJB3 बीन्स में निर्भरता इंजेक्शन CDI बीन्स की तरह लचीला नहीं है और EJB3 बीन्स में स्कूपिंग की कोई अवधारणा नहीं है। हालांकि, EJB3 सेम ट्रांजेक्शनल हैं और डिफ़ॉल्ट रूप से ** , दो बहुत ही उपयोगी चीजें हैं जिन्हें CDI ने EJB3 के डोमेन में छोड़ने के लिए चुना है। अन्य उल्लिखित वस्तुएँ भी CDI में उपलब्ध नहीं हैं। EJB3 का अपना कोई इवेंट बस नहीं है, लेकिन इसमें संदेशों को सुनने के लिए एक विशेष प्रकार की बीन है; संदेश संचालित बीन। इसका उपयोग जावा मैसेजिंग सिस्टम या JCA संसाधन एडाप्टर वाले किसी अन्य सिस्टम से संदेश प्राप्त करने के लिए किया जा सकता है। सरल घटनाओं के लिए पूर्ण विकसित संदेश का उपयोग करना सीडीआई इवेंट बस की तुलना में कहीं अधिक भारी है और ईजेबी 3 केवल एक श्रोता को परिभाषित करता है, निर्माता एपीआई को नहीं।

JSF के शामिल होने के बाद से JSF प्रबंधित बीन्स जावा EE में मौजूद है। वे भी सुविधाdependency injection और scoping। जेएसएफ मैनेज्ड बीन्स ने घोषणात्मक स्कूपिंग की अवधारणा पेश की। मूलतः स्कोप बल्कि सीमित थे और जावा ईई के उसी संस्करण में जहां ईजेबी 3 बीन्स को पहले से ही एनोटेशन के माध्यम से घोषित किया जा सकता था, जेएसएफ मैनेजड बीन्स को अभी भी एक्सएमएल में घोषित किया जाना था। JSF प्रबंधित बीन्स के वर्तमान संस्करण को भी अंत में एक एनोटेशन के माध्यम से घोषित किया जाता है और स्कोप को एक दृश्य दायरे और कस्टम स्कोप बनाने की क्षमता के साथ विस्तारित किया जाता है। दृश्य गुंजाइश, जो एक ही पृष्ठ के अनुरोधों के बीच डेटा को याद करती है, जेएसएफ प्रबंधित बीन्स की एक अनूठी विशेषता है।

व्यू स्कोप के अलावा, जावा ईई 6 में जेएसएफ मैनेजेड बीन्स के लिए अभी भी बहुत कम चल रहा है। सीडीआई में लापता व्यू स्कोप दुर्भाग्यपूर्ण है, क्योंकि अन्यथा सीडीआई जेएसएफ मैनेजेड बीन्स की पेशकश का एक आदर्श सुपर सेट होता। अपडेट : जावा ईई 7 / जेएसएफ 2.2 में एक सीडीआई संगत @ViewScoped जोड़ा गया है, जिससे CDI वास्तव में सुपर सेट हो गया है। अद्यतन 2 : JSF2.3 में JSF प्रबंधित बीन्स को CDI प्रबंधित बीन्स के पक्ष में हटा दिया गया है।

EJB3 और CDI के साथ स्थिति स्पष्ट कटौती नहीं है। EJB3 घटक मॉडल और API बहुत सी सेवाएँ प्रदान करता है जो CDI प्रदान नहीं करता है, इसलिए आमतौर पर EJB3 को CDI से बदला नहीं जा सकता है। दूसरी ओर, CDI को EJB3 के साथ संयोजन में उपयोग किया जा सकता है - जैसे EJBs में स्कोप सपोर्ट जोड़ना।

रेजा रहमान, विशेषज्ञ समूह सदस्य और एक सीडीआई कार्यान्वयन के प्रवर्तक, जिसे कैनडीआई कहा जाता है, ने अक्सर संकेत दिया है कि ईजेबी 3 घटक मॉडल से जुड़ी सेवाओं को सीडीआई एनोटेशन के एक सेट के रूप में रेट्रोफिट किया जा सकता है। अगर ऐसा होता है, तो जावा ईई में सभी प्रबंधित बीन्स सीडीआई बीन्स बन सकते हैं। इसका मतलब यह नहीं है कि EJB3 गायब हो जाता है या अप्रचलित हो जाता है, लेकिन सिर्फ इतना है कि इसकी कार्यक्षमता EJB के स्वयं के एनोटेशन जैसे @Stateless और @EJB के माध्यम से CDI के माध्यम से उजागर होगी।

अपडेट करें

TomEE और OpenEJB प्रसिद्धि के डेविड Blevins अपने ब्लॉग पर CDI और EJB के बीच अंतर और समानता को बहुत अच्छी तरह से समझाते हैं: CDI, जब EJB को बाहर निकालना है

* हालांकि यह संस्करण संख्या में सिर्फ एक वृद्धि है, EJB3 सेम अधिकांश भाग के लिए एक पूरी तरह से अलग तरह का सेम था: एक साधारण पूजो जो एक सरल एकल एनोटेशन को लागू करके "प्रबंधित बीन" बन जाता है, बनाम मॉडल में E2B2 जहां एक हैवीवेट और अत्यधिक वर्बोज़ एक्सएमएल डिस्क्रिप्शन डिस्क्रिप्टर को प्रत्येक और हर बीन के लिए आवश्यक था, बीन के अलावा विभिन्न बेहद हेवीवेट को लागू करने के लिए और अधिकांश भाग अर्थहीन घटक इंटरफेस के लिए आवश्यक था।

** स्टेटलेस सेशन बीन्स को आमतौर पर पूल किया जाता है, स्टेटफुल सेशन सेम आमतौर पर नहीं (लेकिन वे हो सकते हैं)। दोनों प्रकार के लिए पूलिंग इस प्रकार वैकल्पिक है और EJB कल्पना इसे किसी भी तरह से अनिवार्य नहीं करती है।


3
मैं आपके बयानों से थोड़ा भ्रमित हूं कि "EJB3 बीन्स को डांटने की कोई अवधारणा नहीं है" और "EJB3 की अपनी कोई भी घटना बस नहीं है"। कैसे करता है साथ में यह फिट डेविड BLEVIN के दावा है कि "EJBs हैं CDI सेम है सब CDI के लाभ और इसलिए"? जब आप अपना उत्तर लिखते हैं और जब डेविड ने अपना ब्लॉग प्रविष्टि लिखा होता है, तो क्या इस संबंध में कुछ भी बदल गया है?
क्रिस

5
यह शायद कुछ भ्रामक अवधारणा के कारण है कि वास्तव में "सीडीआई बीन्स" वास्तव में नहीं हैं , लेकिन प्रबंधित बीन्स पर लागू होने वाली सेवाएं हैं। चर्चा के लिए लोग (और इस प्रकार स्वयं) वैसे भी उन्हें "सीडीआई बीन्स 'के रूप में संदर्भित करते हैं। सीडीआई से पहले, ईजेबी बीन्स में कोई स्पष्ट ढलान नहीं था। जैसा कि डेविड बताते हैं, स्टेटफुल का अर्थ है कोई गुंजाइश नहीं है (और इस प्रकार विशेष रूप से कोई गुंजाइश नहीं है।) CDI उपलब्ध होने के साथ, EJB बीन्स CDI प्रदान की गई स्कैप्स का लाभ उठा सकते हैं। CDI स्पेक के बिना, इसलिए जब केवल EJB स्पेक को देखते हैं, तो कोई स्पष्ट स्कोप नहीं होते हैं।
Arjan Tijms

1
क्या आप इस बात पर विस्तार से बता सकते हैं कि "प्रबंधित बीन्स पर लागू की गई सेवाएँ" क्या हैं? क्या इसका मतलब है कि वास्तव में सीडीआई बीन जैसी कोई चीज नहीं है? यह केवल कुछ पोज़ो पर अतिरिक्त सुविधाएँ प्रदान कर रहा है - ईजेबी - या जेएसएफ प्रबंधित बीन? जेएसएफ प्रबंधित बीन में इंजेक्ट एनोटेशन का उपयोग करने में सक्षम होने की तरह?
कोरे तुगे

3
@ क्रिस एक EJB कल्पना के परिप्रेक्ष्य से स्पष्ट करते हैं कि हमने CDI की शुरुआत से ही जानबूझकर निर्णय लिया था कि EJB कार्यान्वयन को EJB पर सेट CDI सुविधा के 100% का समर्थन करना होगा। सीडीआई का हर पहलू ईजेबी पर स्कोप के अपवाद के साथ काम करता है जिसे हमें केवल स्टेटफुल बीन्स तक सीमित करना था।
डेविड बालिवंस

1
ध्यान दें कि JSF 2.2 अब javax.faces.view.ViewScoped प्रदान करता है, एक CDI एक्सटेंशन जो अनिवार्य रूप से CDF के JSF व्यू स्कोप का एक पोर्ट है। इसके साथ, CDI JSF मैनेज बीन्स के लिए एक पूर्ण ड्रॉप-इन प्रतिस्थापन है।
jdessey

-1

अल्बर्ट आइंस्टीन: If you can't explain it simply, you don't understand it well enough

Ejbs और CDI समझने में बहुत सरल हैं।

EJBs:

  1. हमेशा स्कोप क्वालिफायर, उदाहरण के लिए, @Stateless, @Stateful, @Request आदि द्वारा एनोटेट किया जाएगा
  2. Ejbs के उदाहरणों को जावा EE ढांचे द्वारा नियंत्रित किया जाता है और इसे जमा किया जाता है। उपभोक्ता के लिए उदाहरण प्रदान करना ईई ढांचे का कर्तव्य है।

@Stateless

 public class CarMaker(){
    public void createCar(Specification specs){
        Car car = new Car(specs);
    }
}

CarMaker विशिष्ट Ejbs गुंजाइश के साथ एनोटेट है, इसलिए, यह Ejb है

CDI:

  1. पूरी तरह से ईई फ्रेमवर्क द्वारा प्रबंधित नहीं किया गया है, उदाहरणों को स्वयं द्वारा निर्मित किया जाना है।
  2. यह हमेशा निर्भर है। मुझे उदाहरण के साथ "निर्भर" समझाएं:

    class Specification { private String color; private String model; //- Getter and Setter }

Specificationके बाद से यह EJB स्कोप के साथ एनोटेट नहीं है और यह भी इस के लिए अपने कोड नहीं ईई ढांचे द्वारा प्रारंभ हो जाता है वर्ग, CDI है। यहां एक बात ध्यान देने वाली है कि चूंकि हमने Specificationक्लास को एनोटेट नहीं किया है , इसलिए यह @Dependentएनोटेशन द्वारा डिफॉल्ट एनोटेट है ।

@Dependent  <- By default added 
class Specification { ... }

Further reading: आपको Ejbs स्कोप एनोटेशन और CDI स्कोप एनोटेशन के बीच अधिक अध्ययन करने की आवश्यकता है, जो कॉन्सेप्ट को और स्पष्ट करेगा


आइंस्टीन ने यह भी कहा: "सब कुछ संभव के रूप में सरल बनाया जाना चाहिए, लेकिन सरल नहीं" आप यहाँ 'समझाया' के साथ 'बना' को बदल सकते हैं।
कुकटेलजे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.