सबसे पहले मुझे कुछ स्पष्टीकरण करने दें:
प्रबंधित बीन परिभाषा : आम तौर पर एक प्रबंधित बीन एक ऐसी वस्तु है जिसका जीवन चक्र (निर्माण, विनाश, आदि) एक कंटेनर द्वारा प्रबंधित किया जाता है।
जावा ई में हमारे पास कई कंटेनर हैं जो उनकी वस्तुओं के जीवन चक्र का प्रबंधन करते हैं, जैसे जेएसएफ कंटेनर, ईजेबी कंटेनर, सीडीआई कंटेनर, सर्वलेट कंटेनर, आदि।
ये सभी कंटेनर स्वतंत्र रूप से काम करते हैं, वे एप्लिकेशन सर्वर आरंभीकरण में बूट करते हैं और सभी कलाकृतियों के जार, ईजब-जार, युद्ध और कान की फाइलों को तैनाती के समय में स्कैन करते हैं और उनके बारे में कुछ मेटाडेटा इकट्ठा और संग्रहीत करते हैं, फिर जब आपको किसी वस्तु की आवश्यकता होती है एक कक्षा में वे आपको उन कक्षाओं के उदाहरण देंगे और नौकरी खत्म करने के बाद उन्हें नष्ट कर देंगे।
तो हम कह सकते हैं कि हमारे पास है:
- 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 एनोटेशन का उपयोग करें
कुछ हिस्से यहां से निकल गए ।