जावा ईई 6 @ javax.annotation.ManagedBean बनाम @ javax.inject.Named बनाम @ javax.faces.ManagedBean


107

मुझे लगता है कि जावा ईई 6 कल्पना में थोड़ा गड़बड़ है। एनोटेशन के कई सेट हैं।

हमारे पास ईजेबी बनाने और बनाने के लिए javax.ejbएनोटेशन हैं ।@Stateful@Stateless

@javax.annotation.ManagedBeanएक प्रबंधित बीन बनाने के लिए एक भी है ।

javax.enterprise.contextजैसे @SessionScopedऔर में एनोटेशन हैं @RequestScoped

क्या है और अधिक भी देखते हैं @ManagedBeanऔर @SessionScoped/ @RequestScopedमें व्याख्या का javax.faces.beanपैकेज।

और चीजों को अधिक जटिल बनाने के लिए एनोटेशन के javax.injectसाथ एक पैकेज है @Named

क्या कोई यह वर्णन कर सकता है कि वे एक दूसरे से कैसे संबंधित हैं?

मैं कहां उपयोग कर सकता हूं @EJB, @Injectया @ManagedProperyअन्य बीन्स को इंजेक्ट कर सकता हूं ?


जवाबों:


194

सबसे पहले मुझे कुछ स्पष्टीकरण करने दें:

प्रबंधित बीन परिभाषा : आम तौर पर एक प्रबंधित बीन एक ऐसी वस्तु है जिसका जीवन चक्र (निर्माण, विनाश, आदि) एक कंटेनर द्वारा प्रबंधित किया जाता है।

जावा ई में हमारे पास कई कंटेनर हैं जो उनकी वस्तुओं के जीवन चक्र का प्रबंधन करते हैं, जैसे जेएसएफ कंटेनर, ईजेबी कंटेनर, सीडीआई कंटेनर, सर्वलेट कंटेनर, आदि।

ये सभी कंटेनर स्वतंत्र रूप से काम करते हैं, वे एप्लिकेशन सर्वर आरंभीकरण में बूट करते हैं और सभी कलाकृतियों के जार, ईजब-जार, युद्ध और कान की फाइलों को तैनाती के समय में स्कैन करते हैं और उनके बारे में कुछ मेटाडेटा इकट्ठा और संग्रहीत करते हैं, फिर जब आपको किसी वस्तु की आवश्यकता होती है एक कक्षा में वे आपको उन कक्षाओं के उदाहरण देंगे और नौकरी खत्म करने के बाद उन्हें नष्ट कर देंगे।

तो हम कह सकते हैं कि हमारे पास है:

  • JSF सेम में कामयाब रहे
  • सीडीआई सेम का प्रबंधन किया
  • EJB सेम में कामयाब रहे
  • और यहां तक ​​कि सर्वलेट्स का प्रबंधन सेम के रूप में किया जाता है क्योंकि वे एक कंटेनर द्वारा त्वरित और नष्ट हो जाते हैं, जो एक सर्वलेट कंटेनर है।

इसलिए जब आप प्रबंधित बीन शब्द देखते हैं, तो आपको इसके संदर्भ या प्रकार के बारे में पूछना चाहिए। (JSF, CDI, EJB, आदि)

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

उसी समय (समानांतर में) उन्होंने महसूस किया कि उन्हें जेएसएफ का भी समर्थन करने की आवश्यकता है, फिर उन्होंने जेएसएफ प्रबंधित बीन्स और जेएसएफ बीन्स के लिए एक और कंटेनर बनाया और उन्होंने इसे एक परिपक्व डीआई कंटेनर माना, लेकिन फिर भी यह पूर्ण और परिपक्व कंटेनर नहीं था।

उसके बाद गेविन किंग और कुछ अन्य अच्छे लोग;) ने सीडीआई बनाया जो कि सबसे परिपक्व डीआई कंटेनर है जिसे मैंने देखा है। CDI (Seam2, Guice और Spring से प्रेरित) JSF और EJB और बहुत से अन्य उपयोगी सामान जैसे पूजो इंजेक्शन, निर्माता के तरीके, इंटरसेप्टर, डेकोरेटर, एकीकरण SPI, बहुत लचीले, आदि के बीच की खाई को भरने के लिए बनाया गया था और यह भी कर सकता है। ईजेबी और जेएसएफ प्रबंधित बीन्स क्या कर रहे हैं तो हमारे पास सिर्फ एक परिपक्व और शक्तिशाली डीआई कंटेनर हो सकता है। लेकिन कुछ पिछड़े संगतता और राजनीतिक कारणों के लिए जावा ईई लोग उन्हें रखना चाहते हैं !!!

आप इनमें से प्रत्येक प्रकार के लिए अंतर पा सकते हैं और मामलों का उपयोग कर सकते हैं:

जेएसएफ प्रबंधित बीन्स, सीडीआई बीन्स और ईजेबी

जेएसएफ को शुरू में अपने स्वयं के प्रबंधित बीन और निर्भरता इंजेक्शन तंत्र के साथ विकसित किया गया था जो एनएसएफ 2.0 को एनोटेशन आधारित बीन्स को शामिल करने के लिए बढ़ाया गया था। जब सीडीआई को जावा ईई 6 के साथ जारी किया गया था, तो इसे उस मंच के लिए प्रबंधित बीन फ्रेमवर्क के रूप में माना गया था और निश्चित रूप से, ईजेबी ने उन सभी को पुराना कर दिया था, जो एक दशक से भी अधिक समय से चले आ रहे थे।

पाठ्यक्रम की समस्या यह जान रही है कि किसका उपयोग करना है और कब उनका उपयोग करना है।

आइए सबसे सरल, JSF प्रबंधित बीन्स के साथ शुरू करें।

JSF प्रबंधित बीन्स

संक्षेप में, यदि आप जावा ईई 6 के लिए विकसित कर रहे हैं और सीडीआई का उपयोग कर रहे हैं तो उनका उपयोग न करें। वे निर्भरता इंजेक्शन और वेब पृष्ठों के लिए बैकिंग बीन्स को परिभाषित करने के लिए एक सरल तंत्र प्रदान करते हैं, लेकिन वे सीडीआई बीन्स की तुलना में बहुत कम शक्तिशाली हैं।

उन्हें @javax.faces.bean.ManagedBeanएनोटेशन का उपयोग करके परिभाषित किया जा सकता है जो एक वैकल्पिक नाम पैरामीटर लेता है। इस नाम का उपयोग JSF पृष्ठों से सेम को संदर्भित करने के लिए किया जा सकता है।

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

@ManagedBean(name="someBean")
@RequestScoped
public class SomeBean {
    ....
    ....
}

जेएसएफ बीन्स को किसी प्रकार के मैनुअल कोडिंग के बिना अन्य प्रकार के बीन्स के साथ मिश्रित नहीं किया जा सकता है।

सीडीआई बीन्स

CDI सेम प्रबंधन और निर्भरता इंजेक्शन ढांचा है जो जावा ईई 6 के हिस्से के रूप में जारी किया गया था और इसमें पूर्ण, व्यापक प्रबंधन सुविधा शामिल है। CDI बीन्स साधारण JSF प्रबंधित बीन्स की तुलना में कहीं अधिक उन्नत और लचीली हैं। वे इंटरसेप्टर, वार्तालाप स्कोप, ईवेंट, टाइप सेफ इंजेक्शन, डेकोरेटर, स्टीरियोटाइप्स और निर्माता विधियों का उपयोग कर सकते हैं।

CDI सेम को परिनियोजित करने के लिए, आपको classpath पर META-INF फ़ोल्डर में beans.xml नामक एक फ़ाइल रखनी होगी। एक बार जब आप ऐसा करते हैं, तो पैकेज में प्रत्येक बीन एक सीडीआई बीन बन जाता है। CDI में बहुत सारी विशेषताएँ हैं, यहाँ भी बहुत कुछ है, लेकिन JSF जैसी विशेषताओं के लिए एक त्वरित संदर्भ के रूप में, आप javax.enterprise.contextपैकेज में परिभाषित स्कोप में से एक का उपयोग करके CDI बीन के दायरे को परिभाषित कर सकते हैं (जैसे, अनुरोध, वार्तालाप , सत्र और आवेदन स्कोप)। यदि आप JSF पेज से CDI बीन का उपयोग करना चाहते हैं, तो आप javax.inject.Namedएनोटेशन का उपयोग करके इसे एक नाम दे सकते हैं । एक सेम को दूसरे सेम में इंजेक्ट करने के लिए, आप javax.inject.Injectएनोटेशन के साथ क्षेत्र को एनोटेट करते हैं ।

@Named("someBean")
@RequestScoped
public class SomeBean {

    @Inject
    private SomeService someService;
}

उस तरह के स्वचालित इंजेक्शन को क्वालिफायर के उपयोग के माध्यम से नियंत्रित किया जा सकता है जो उस विशिष्ट वर्ग से मेल खाने में मदद कर सकता है जिसे आप इंजेक्ट करना चाहते हैं। यदि आपके पास कई भुगतान प्रकार हैं, तो आप इसके लिए एक अर्हक जोड़ सकते हैं कि यह अतुल्यकालिक है या नहीं। जब आप @Namedएनोटेशन का उपयोग क्वालिफायर के रूप में कर सकते हैं , तो आपको ईएल में सेम को उजागर करने के लिए प्रदान नहीं किया जाना चाहिए।

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

CDI को इंटरसेप्टर, ईवेंट्स, नई वार्तालाप गुंजाइश और कई अन्य विशेषताओं के लिए भी समर्थन मिला है, जो इसे JSF प्रबंधित बीन्स पर एक बेहतर विकल्प बनाता है।

EJB

EJBs CDI बीन्स की भविष्यवाणी करते हैं और CDI सेम के समान और किसी अन्य तरीके से बहुत भिन्न हैं। मुख्य रूप से, सीडीआई बीन्स और ईजेबी के बीच अंतर यह है कि ईजेबी हैं:

  • लेन-देन संबंधी
  • दूरस्थ या स्थानीय
  • संसाधनों को मुक्त करने के लिए राज्य फलियों को निष्क्रिय करने में सक्षम
  • टाइमर का उपयोग करने में सक्षम
  • अतुल्यकालिक हो सकता है

दो प्रकार के EJB को स्टेटलेस और स्टेटफुल कहा जाता है। स्टेटलेस ईजेबी को थ्रेड सेफ सिंगल-यूज़ बीन्स के रूप में माना जा सकता है जो दो वेब अनुरोधों के बीच किसी भी स्थिति को बनाए नहीं रखते हैं। स्टेटफुल EJB स्टेट्स करते हैं और जब तक उनकी जरूरत होती है, तब तक उन्हें इधर-उधर बैठाया जा सकता है।

एक EJB को परिभाषित करना सरल है, आप बस कक्षा में javax.ejb.Statelessया तो एक javax.ejb.Statefulएनोटेशन जोड़ते हैं ।

@Stateless
public class BookingService {

  public String makeReservation(Item Item, Customer customer) {
    ...
    ...
  }
}

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

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

javax.inject.Namedएनोटेशन साथ ही किसी भी क्वालिफायर एक EJB पर इस्तेमाल किया जा सकता एक इंजेक्शन बिंदु से मिलान कर।

कब किस बीन का इस्तेमाल करें

आप कैसे जानते हैं कि किस बीन का उपयोग कब करना है सरल।

जब तक आप सर्वलेट कंटेनर में काम नहीं कर रहे हैं, तब तक जेएसएफ प्रबंधित बीन्स का उपयोग न करें और टॉमकैट में सीडीआई काम करने की कोशिश नहीं करना चाहते हैं (हालांकि इसके लिए कुछ मावेन आर्कटाइप्स हैं, इसलिए कोई बहाना नहीं है)।

सामान्य तौर पर, आपको सीडीआई बीन्स का उपयोग करना चाहिए जब तक कि आपको ईजेबी में उपलब्ध उन्नत कार्यक्षमता की आवश्यकता न हो जैसे कि ट्रांजेक्शनल फ़ंक्शन। आप CDI बीन्स को ट्रांसेक्शनल बनाने के लिए अपना स्वयं का इंटरसेप्टर लिख सकते हैं, लेकिन अभी के लिए, EJB का उपयोग करना सरल है जब तक कि CDI को ट्रांसेक्शनल CDI बीन्स नहीं मिल जाते हैं जो कि कोने के चारों ओर है। यदि आप एक सर्वलेट कंटेनर में फंस गए हैं और सीडीआई का उपयोग कर रहे हैं, तो या तो लिखित लेन-देन करें या ईजेबी के बिना आपका स्वयं का लेनदेन इंटरसेप्टर एकमात्र विकल्प है।

यदि आपको @ViewScopedसीडीआई में उपयोग करने की आवश्यकता है तो आपको चाहिए

  • का उपयोग सीवन-चेहरे या MyFaces CODI मॉड्यूल। बस अपने वर्गपथ में उनमें से एक जोड़ें और @ViewScopedसीडीआई में काम करेंगे। MyFaces CODI में @ViewScoped का और भी अधिक ठोस समर्थन है
  • MyFaces CODI का उपयोग करें @ViewAccessScoped, यह अपाचे द्वारा CDI के शीर्ष पर लिखा गया एक एक्सटेंशन है, बस इसे डाउनलोड करें और @ViewAccessScopedइसके बजाय एनोटेशन का उपयोग करें @ViewScoped
  • सीडीआई का उपयोग करें @ConversationScopedऔर इसे लंबे समय तक चलने दें। अधिक जानकारी के लिए यहां देखें ।
  • Omnifaces @ViewScoped एनोटेशन का उपयोग करें

कुछ हिस्से यहां से निकल गए


3
यह भी खूब रही! धन्यवाद! पूर्ण होने के लिए, बस यह बताएं कि CDF या EJB बीन को JSF बीन में कैसे इंजेक्ट किया जाए। क्या @ManagedProperty("#{someBean})"उचित तरीका है?
पियोट्र ग्विजाडा

2
नहीं! यह काम नहीं करेगा। बस अपने JSF कामयाब सेम बारी CDI का उपयोग कर इसे व्याख्या द्वारा सेम में कामयाब करने के लिए @Namedऔर @javax.enterprise.context.RequestScopedऔर उपयोग CDI इंजेक्शन @Inject एनोटेशन का उपयोग कर। यदि आपके पास नहीं है तो jsf प्रबंधित बीन्स का उपयोग न करें;)।
मेहदी

3
> JEE के लोग उन्हें रखना चाहते हैं !!! - यह उससे थोड़ा अधिक सूक्ष्म है। CDI जावा EE 6 चक्र में देर से समाप्त हुआ और JSF 2 और JAX-RS दोनों पहले ही हो चुके थे। उन्होंने सम्मान बढ़ाया था। पहले से ही अपनी खुद की प्रबंधित बीन सुविधा शुरू की। अगर CDI पहले उपलब्ध होती, तो चीजें अलग-अलग दिखतीं। जावा ईई 7 में, जेएसएफ सीडीआई को गोद लेगा और javax.faces.bean को अंत में पदावनत किया जाएगा (जावा ईई में अपवित्रीकरण एक धीमी प्रक्रिया है, हालांकि, जो अच्छा और बुरा दोनों है)।
अर्जन टिजम्स

3
जब आप कहते हैं: CDI बीन्स को तैनात करने के लिए, आपको क्लासपाथ पर META-INF फ़ोल्डर में सेम। Xml नामक एक फ़ाइल रखनी होगी। एक बार जब आप ऐसा करते हैं, तो पैकेज में प्रत्येक बीन एक सीडीआई बीन बन जाता है। क्या आपका मतलब है कि हर बीन भी सीडीआई बीन बन जाता है इसके अलावा क्या था? क्या होगा अगर मेरे पास मैनफ़ेडबिन और व्यूस्कॉप्ड के साथ जेएसएफ मेनेजेडबीन्स हैं। वे अभी भी जेएसएफ प्रबंधित बीन्स हैं?
कोरे तुगे

3
इस महान लेख पर जावा ईई 7 के लिए कोई अपडेट करने में सक्षम है?
मार्टिगन बर्गर

7

हां, यह भ्रामक हो सकता है।

कुछ लोगों के लिए ehm ऐतिहासिक कारणों JSF और CDI कार्यक्षेत्रों के लिए वही एनोटेशन का उपयोग कर रहे है, लेकिन विभिन्न संकुल से।

जैसा कि आप शायद अनुमान लगा javax.faces.beanरहे हैं कि जेएसएफ कल्पना से हैं, और सीडीआई से संबंधित नहीं हैं। जब तक आपके पास ऐसा करने का एक बहुत अच्छा कारण न हो, तब तक उनका उपयोग न करें। और कभी भी उन्हें CDI एनोटेशन से मिलाएं नहीं javax.ejb। यह कीड़े और सूक्ष्म विसंगतियों की एक सरासर अंतहीन सूची का उत्पादन करेगा।

मैं आमतौर पर सलाह देता हूं कि आप उत्कृष्ट वेल्ड प्रलेखन के पहले कुछ (या इससे भी अधिक) पृष्ठों को स्किम करें । यह आपको जावा ईई 6 के लिए ट्रैक पर रखना चाहिए।

और बेझिझक आगे के प्रश्न यहाँ पोस्ट करें।


वास्तव में मेरे दो प्रश्न हैं: 1. मुझे अक्सर दृश्य क्षेत्र बहुत उपयोगी लगता है। मुझे तब JSF एनोटेशन का उपयोग करने की आवश्यकता है? 2. इसका मतलब है कि @javax.annotation.ManagedBeanCDI सभी वर्गों को प्रबंधित फलियों के रूप में बेकार मानता है, क्या मैं सही हूं?
पिओटर ग्विजाडा

काफी नहीं। आपको जेएसएफ स्कोप्स को सीडीआई को उदाहरण के लिए सीम फेस के साथ पुल करना होगा। और हाँ, @ManagedBeans की जरूरत नहीं है अगर आप प्रासंगिक जार फ़ाइल में एक सेम। Xml है। ओह, और अगर आपके पास और प्रश्न हैं तो टिप्पणी अनुभाग में खुद को ढीला करने से पहले एक नया सूत्र शुरू करना बेहतर है।
जान ग्रथ

3

चूँकि विशेष रूप से इस बारे में कोई जवाब नहीं है @javax.annotation.ManagedBean, यहाँ एक समान प्रश्न का उत्तर दिया गया है: बैकिंग बीन्स (@ManagedBean) या CDI बीन्स (@ नाम)? । युक्ति http://download.oracle.com/otndocs/jcp/managed_beans-1.0-fr-eval-oth-JSpec/ पर देखी जा सकती है । तो यह मुझे लगता है कि @javax.annotation.ManagedBeanएक सामान्यीकरण होना चाहिए था @javax.faces.bean.ManagedBean

मैं जो इकट्ठा किया था, उससे JSF मैनेज बीन्स को CDI बीन्स के पक्ष में चरणबद्ध किया जा रहा है (शायद JSF 2.3 से पदावनत हो रही है?), इसलिए मुझे लगता @javax.annotation.ManagedBeanहै कि सभी अब अप्रचलित हो रहे हैं।


@Named@ManagedBeanभविष्य में प्रतिस्थापित करेगा ?
थुफ़िर

1
मैंने विभिन्न जावा ईई विशेषज्ञों द्वारा कई बयान पढ़े हैं जो भविष्यवाणी करते हैं कि सीडीआई @Namedबीन्स जेएसएफ की जगह लेंगे @ManagedBeans, जैसे stackoverflow.com/questions/4347374/… , BalusC का कहना है "उम्मीद है कि @ManagedBean और दोस्तों को जावा के अनुसार पदावनत किया जाएगा। ईई 8. "।
हेन ब्लॉड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.