सीडीआई का उपयोग करें।
JSF 2.3 के अनुसार, @ManagedBean
है पदावनत । 1417 को भी देखें । इस का अर्थ है कि अब और चयन करने के लिए एक कारण नहीं है कि @ManagedBean
अधिक @Named
। यह पहली बार मोअज़रा 2.3.0 बीटा संस्करण m06 में लागू किया गया था।
इतिहास
मुख्य अंतर यह @ManagedBean
है कि जेएसएफ ढांचे द्वारा प्रबंधित किया जाता है और केवल @ManagedProperty
जेएसएफ प्रबंधित बीन्स के लिए उपलब्ध है। @Named
CDI ढांचे के माध्यम से आवेदन सर्वर (कंटेनर) द्वारा प्रबंधित और के माध्यम से है @Inject
की तरह एक कंटेनर में कामयाब विरूपण साक्ष्य के किसी भी प्रकार के लिए उपलब्ध @WebListener
, @WebFilter
, @WebServlet
, @Path
, @Stateless
, आदि और यहां तक कि एक JSF @ManagedBean
। दूसरी तरफ से, एक या किसी अन्य कंटेनर प्रबंधित कलाकृति के अंदर काम नहीं@ManagedProperty
करता है। यह वास्तव में केवल अंदर काम करता है ।@Named
@ManagedBean
एक और अंतर यह है कि सीडीआई वास्तव में प्रति-अनुरोध / थ्रेड के आधार पर लक्ष्य दायरे में वर्तमान उदाहरण को दर्शाता हुआ प्रॉक्सीज़ को इंजेक्ट करता है (जैसे कि ईजेबी को कैसे इंजेक्ट किया जाता है)। यह तंत्र व्यापक दायरे के बीन में संकरे दायरे की बीन को इंजेक्ट करने की अनुमति देता है, जो JSF के साथ संभव नहीं है @ManagedProperty
। जेएसएफ "इंजेक्ट" करता है यहां भौतिक उदाहरण सीधे एक सेटर का आह्वान करके (यही कारण है कि एक सेटर की आवश्यकता है, जबकि इसके साथ की आवश्यकता नहीं है @Inject
)।
जबकि प्रत्यक्ष रूप से नुकसान नहीं है - अन्य तरीके हैं - का दायरा @ManagedBean
बस सीमित है। दूसरे दृष्टिकोण से, यदि आप "बहुत अधिक" को उजागर नहीं करना चाहते हैं, तो आप @Inject
अपने प्रबंधित बीन्स को भी रख सकते हैं @ManagedBean
। यह protected
बनाम की तरह है public
। लेकिन यह वास्तव में गिनती नहीं है।
कम से कम, JSF 2.0 / 2.1 में, CDI द्वारा JSF बैकिंग बीन्स के प्रबंधन का प्रमुख नुकसान यह है कि इसके बराबर कोई CDI नहीं है @ViewScoped
। @ConversationScoped
करीब आता है, लेकिन अभी भी मैन्युअल रूप से शुरू करने और रोकने की आवश्यकता है और यह एक बदसूरत संलग्न कर देता है cid
परिणाम यूआरएल के लिए अनुरोध पैरामीटर। MyFaces CODI ने पूरी तरह से पारदर्शी तरीके से JSF की javax.faces.bean.ViewScoped
CDI को आसान बनाकर इसे आसान बना दिया है ताकि आप बस ऐसा कर सकें @Named @ViewScoped
, हालाँकि यह windowId
URL के परिणाम के लिए एक बदसूरत अनुरोध पैरामीटर को जोड़ता है , वह भी सादे वेनिला पेज-टू-पेज नेविगेशन पर। OmniFaces यह सब एक सच्चे CDI के साथ हल करता है @ViewScoped
जो वास्तव में एक मनमाने ढंग से अनुरोध पैरामीटर के बजाय JSF व्यू स्टेट में सेम के दायरे को शामिल करता है।
JSF 2.2 (जो इस प्रश्न / उत्तर के 3 साल बाद जारी किया गया है) @ViewScoped
स्वाद में बॉक्स के बाहर एक पूरी तरह से सीडीआई संगत एनोटेशन प्रदान करता है javax.faces.view.ViewScoped
। JSF 2.2 भी एक CDI-only के साथ आता है, @FlowScoped
जिसमें @ManagedBean
समतुल्य नहीं है , जिससे JSF उपयोगकर्ताओं को CDI की ओर धकेल दिया जाता है। उम्मीद है कि @ManagedBean
और दोस्तों को जावा ईई 8. के अनुसार पदावनत किया जाएगा। यदि आप अभी भी उपयोग कर रहे हैं @ManagedBean
, तो इसलिए भविष्य के अपग्रेड पथों के लिए तैयार होने के लिए सीडीआई पर स्विच करने की दृढ़ता से अनुशंसा करते हैं। सीडीआई जावा ईई वेब प्रोफाइल संगत कंटेनरों में आसानी से उपलब्ध है, जैसे कि वाइल्डफली, टॉमईई और ग्लासफिश। टॉमकैट के लिए, आपको इसे अलग से इंस्टॉल करना होगा, ठीक उसी तरह जैसे आपने पहले ही JSF के लिए किया था। यह भी देखें कि टॉमकैट में सीडीआई कैसे स्थापित करें?