2011-11-15 13 views
125

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

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

उत्तर

155

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

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

एंटोनियो गोन्साल्वेस 'ब्लॉग:
CDI Part I
CDI Part II
CDI Part III

JBoss वेल्ड

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

StackOverflow:
Inject @EJB bean based on conditions

+3

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

28

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

+1

वास्तव में क्या इंजेक्शन बनाता है जब हम @Inject का उपयोग के लिए देखते हैं? जावाईई कंटेनर? क्या यह पीओजेओ इंजेक्ट कर सकता है? –

+3

सीडीआई के साथ यह सीडीआई कंटेनर है (जावाईई कंटेनर में बंडल) – Bozho

11

यहाँ विषय पर एक अच्छी चर्चा है। गैविन किंग गैर रिमोट ईजेबी के लिए @EJB पर @ इंजेक्ट की सिफारिश करता है।

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

या

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

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

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

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

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

मैं दूरस्थ EJBs के लिए संदर्भ की घोषणा के अलावा @EJB के इस्तेमाल के खिलाफ की सिफारिश:

असल में, @Inject के बाद से हमेशा बेहतर है।

और

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

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

    क्या इसका मतलब है @EJB रिमोट ईजेबी के साथ बेहतर है?

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

+1

हालांकि यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर होगा, और संदर्भ के लिए लिंक प्रदान करते हैं। इस तरह यह जवाब तब भी मूल्यवान होगा जब लिंक मर चुका है। – Mifeet

+0

@ जॉन मंको, पेज आउट ... 404 त्रुटि ... :( –

+1

https: //web.archive।संगठन/वेब/20140812065624/http: //www.seamframework.org/107780.lace –

11

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

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

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

+0

क्या आप इसे समझाते हुए एक कोड उदाहरण जोड़ सकते हैं? –

+0

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

+0

मैंने दो pojo बनाया और pojo एक दूसरे में इंजेक्शन दिया। मेरी कॉन्फ़िगरेशन में समस्या के बिना काम करता है (WildFly 8.2 = CDI 1.2) –

0

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

2

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

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

@EJB के बजाय @Inject का उपयोग करते हुए एक ही नहीं है।

भी stateless session beans identity अधिक जानकारी

संबंधित मुद्दे