क्या मुझे @EJB या @Inject का उपयोग करना चाहिए


148

मुझे यह सवाल मिला है: @Inject और @EJB में क्या अंतर है लेकिन मुझे कोई समझदार नहीं मिला। मैंने पहले जावा ईई नहीं किया है और न ही मुझे निर्भरता इंजेक्शन के साथ अनुभव है, इसलिए मुझे समझ में नहीं आता है कि मुझे क्या उपयोग करना चाहिए?

क्या @EJB इंजेक्शन लगाने का पुराना तरीका है? क्या EJB कंटेनर द्वारा किया गया इंजेक्शन @ एनजेक्ट का उपयोग करते समय इस एनोटेशन का उपयोग करते हुए नए CDI ढांचे का उपयोग करता है? यदि यह मामला है तो क्या अंतर और क्या मुझे @EJB के बजाय @ इंजेक्शन का उपयोग करना चाहिए?

जवाबों:


178

@EJBEJB के केवल इंजेक्षन करने के लिए इस्तेमाल किया और अब काफी कुछ समय के लिए उपलब्ध है है। @Injectकिसी भी प्रबंधित बीन को इंजेक्ट कर सकते हैं और नए सीडीआई विनिर्देशन का एक हिस्सा है (जावा ईई 6 के बाद से)।

सामान्य मामलों में तो आप बस को बदल सकते हैं @EJBकरने के लिए @Inject। अधिक उन्नत मामलों में (उदाहरण के लिए, जब आप उपयोग करने के लिए किसी क्षेत्र या विधि को परिभाषित करने की आवश्यकता होती है , तो आप जिस @EJBतरह के गुणों पर निर्भर करते हैं beanName, lookupया उससे beanInterfaceअधिक) ।@Inject@Producer

इन संसाधनों के बीच मतभेदों को समझने के लिए उपयोगी हो सकता है @EJBऔर @Producesऔर उनमें से सबसे अच्छा पाने के लिए:

एंटोनियो गोंकाल्वेस का ब्लॉग:
सीडीआई भाग I
सीडीआई भाग II
सीडीआई भाग III

JBoss वेल्ड प्रलेखन:
CDI और Java EE पारिस्थितिकी तंत्र

StackOverflow:
शर्तों के आधार पर @EJB सेम इंजेक्षन


4
@EJBवृत्ताकार इंजेक्शन (एक सिंगल बीन और दूसरे बीन को एक दूसरे के संदर्भ की आवश्यकता) के लिए क्यों काम करता है ? (नीचे मेरे उत्तर के संदर्भ में - मुझे यकीन नहीं है कि मैं सही काम कर रहा हूँ @EJB)
नेक्रोमन्ट

2
क्योंकि आप कार्यान्वयन को इंजेक्ट नहीं कर रहे हैं, लेकिन एक प्रॉक्सी जो कार्यान्वयन पर हस्तक्षेप करता है। इस वजह से, आपको "देर से बाध्यकारी" और अन्य कंटेनर सुविधाओं के फायदे मिलते हैं।
उसे

33

@Injectकिसी भी सेम इंजेक्षन कर सकते हैं, जबकि @EJBकेवल EJBs इंजेक्षन कर सकते हैं। आप या तो ईजेबी को इंजेक्ट करने के लिए उपयोग कर सकते हैं, लेकिन मैं @Injectहर जगह पसंद करूंगा ।


1
जब हम @ का उपयोग करते हैं तो वास्तव में इंजेक्शन क्या बनाता है? JavaEE कंटेनर? क्या यह पीओजेओ को इंजेक्ट कर सकता है?
कोरे तुगे

3
CDI के साथ यह CDI कंटेनर (JavaEE कंटेनर में बंडल किया गया) है
Bozho

16

अद्यतन: यह उत्तर गलत या पुराना हो सकता है। कृपया विवरण के लिए टिप्पणियाँ देखें।

मैंने उस पर स्विच किया @Inject, @EJBक्योंकि उस पर पुक करते हुए @EJBपरिपत्र इंजेक्शन की अनुमति देता @Injectहै।

विवरण: मुझे @PostConstructएक @Asynchronousविधि को कॉल करने की आवश्यकता थी, लेकिन यह इतने तुल्यकालिक रूप से करेगा। अतुल्यकालिक कॉल करने का एकमात्र तरीका मूल कॉल में एक अन्य बीन की विधि थी और क्या यह मूल बीन की विधि को वापस बुलाती है। ऐसा करने के लिए प्रत्येक बीन को दूसरे के संदर्भ की आवश्यकता होती है - इस प्रकार परिपत्र। @Injectकाम करते समय इस कार्य के लिए असफल रहा @EJB


@MartijnBurger मेरे पास कोड काम नहीं है, न ही जावा EE पर्यावरण काम है। बस 2 जावा कक्षाएं बनाएं और @Injectउन्हें एक दूसरे के सार्वजनिक क्षेत्रों में बनाएं । अगर वह काम करता है तो मेरा जवाब गलत है। अगर वह काम नहीं करता है, तो मेरा जवाब अब तक सही है। अगला परिवर्तन @Injectकरने के लिए @EJB(और संभवतः वर्गों खुद को व्याख्या? मैं भूल जाते हैं।)। फिर चक्रीय आपसी इंजेक्शन ठीक काम करना चाहिए। इसीलिए मैंने इससे किनारा @Injectकर लिया @EJB। आशा है कि यह समझ में आता है।
नेक्रोमन्ट

मैंने दो पोजो बनाए और पूजो को एक दूसरे में इंजेक्ट किया। मेरे विन्यास में समस्याओं के बिना काम करता है (WildFly 8.2 = CDI 1.2)
Martijn बर्गर

1
धन्यवाद @MartijnBurger, मैं इस बात की पुष्टि करूँगा, और इस बीच मेरे उत्तर में सावधानी बरतें।
नेक्रोमन्ट

कोई निश्चित रूप से निश्चित नहीं है कि आप क्या हासिल करना चाहते थे, लेकिन यह संभवतः वही करता है जो आप चाहते थे और एक परिपत्र निर्भरता के बिना। tomee.apache.org/examples-trunk/async-postconstruct/README.html । इसके अलावा अतुल्यकालिक सीडीआई घटनाओं को जाने के लिए एक क्लीनर तरीका हो सकता है (आवश्यकताओं के आधार पर)।
JanM

12

यहाँ विषय पर एक अच्छी चर्चा है। गैर दूरस्थ EJBs के लिए @EJB पर Gavin King ने @Inject की सिफारिश की।

http://www.seamframework.org/107780.lace

या

https://web.archive.org/web/20140812065624/http://www.seamframework.org/107780.lace

पुन :: @EJB या @ के साथ इंजेक्शन?

  1. नवम्बर 2009, 20:48 अमेरिका / न्यू_यॉर्क | लिंक गाविं राजा

यह त्रुटि बहुत अजीब है, क्योंकि ईजेबी स्थानीय संदर्भ हमेशा क्रमबद्ध होना चाहिए। ग्लासफिश में बग, शायद?

असल में, @ विषय हमेशा बेहतर होता है, क्योंकि:

it is more typesafe,
it supports @Alternatives, and
it is aware of the scope of the injected object.

मैं दूरस्थ EJBs के संदर्भों को छोड़कर @EJB के उपयोग के खिलाफ सुझाव देता हूं।

तथा

पुन :: @EJB या @ के साथ इंजेक्शन?

  1. नवम्बर 2009, 17:42 अमेरिका / न्यू_यॉर्क | लिंक गाविं राजा

    क्या इसका मतलब दूरस्थ EJB के साथ @EJB बेहतर है?

दूरस्थ EJB के लिए, हम सेम क्लास पर क्वालीफायर, @Alternative, आदि जैसे मेटाडेटा की घोषणा नहीं कर सकते हैं, क्योंकि क्लाइंट को बस उस मेटाडेटा तक पहुंच नहीं है। इसके अलावा, कुछ अतिरिक्त मेटाडेटा को निर्दिष्ट किया जाना चाहिए कि हमें स्थानीय मामले (जो भी हो JNDI का वैश्विक नाम) की आवश्यकता नहीं है। तो वह सब सामान कहीं और जाने की जरूरत है: अर्थात् @ घोषणाओं को पूरा करता है।


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


4

यह @EJB और @Inject का उपयोग करते समय सत्र बीन पहचान की अवधि में अंतर को समझने के लिए भी उपयोगी हो सकता है। विनिर्देशों के अनुसार निम्नलिखित कोड हमेशा रहेगा true:

@EJB Cart cart1;
@EJB Cart cart2;
 if (cart1.equals(cart2)) { // this test must return true ...}

@EJB की जगह @Inject का उपयोग करना समान नहीं है।

अधिक जानकारी के लिए स्टेटलेस सत्र बीन्स पहचान भी देखें


0

उदाहरण के लिए, इंजेक्शन पहले से ही जावा ईई 5 में @Resource, @PersistentUnit या @EJB एनोटेशन के साथ मौजूद था। लेकिन यह कुछ संसाधनों (डेटासोर्स, EJB।) तक सीमित था और कुछ घटकों में (Servlets, EJBs, JSF बैकिंग बीन।)।) CDI के साथ आप @Inject एनोटेशन की बदौलत कहीं भी कुछ भी इंजेक्ट कर सकते हैं।

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