समर्थन सेम (@ प्रबंधित) या सीडीआई बीन्स (@ नाम)?


109

मैंने अभी Core JavaServer Faces, 3rd Ed के माध्यम से पढ़ना शुरू किया है और वे यह कहते हैं (मेरा जोर):

यह एक ऐतिहासिक दुर्घटना है कि सेम के लिए दो अलग-अलग तंत्र, सीडीआई बीन्स और जेएसएफ प्रबंधित बीन्स हैं, जिन्हें जेएसएफ पृष्ठों में उपयोग किया जा सकता है। हमारा सुझाव है कि आप CDI बीन्स का उपयोग करें जब तक कि आपके एप्लिकेशन को Tomcat जैसे सादे सर्वलेट रनर पर काम नहीं करना चाहिए।

क्यों? वे कोई औचित्य प्रदान नहीं करते हैं । मैं @ManagedBeanGlassFish 3 पर चल रहे एक प्रोटोटाइप एप्लिकेशन में सभी सेम के लिए उपयोग कर रहा हूं , और मैंने वास्तव में इसके साथ किसी भी मुद्दे पर ध्यान नहीं दिया है। मुझे विशेष रूप से माइग्रेट करने में कोई दिक्कत नहीं @ManagedBeanहै @Named, लेकिन मैं जानना चाहता हूं कि मुझे क्यों परेशान होना चाहिए



4
@Bozho: यह प्रश्न काफी हद तक समान है, लेकिन पास्कल के उत्तर को कुछ समय पढ़ने के बाद, मुझे अभी भी समझ नहीं आया कि CDI क्यों श्रेष्ठ है। मैं CDI नहीं जानता और मुझे यह जानकर खुशी हुई क्योंकि यह "बेहतर" है। यह बेहतर क्यों है?
मैट बॉल

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

1
@ कार्लकेल्डन "सादे सर्वलेट रनर" एक गैर-सीडीआई सक्षम सर्वलेट कंटेनर को संदर्भित करता है। लिखने के समय टॉमकैट ने सीडीआई का समर्थन नहीं किया था, सिवाय जादू के।
थोरबजोरन रावन एंडरसन

जवाबों:


64

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


इसलिए मूल रूप से, मैं लगभग किसी भी वर्ग के उदाहरण को इंजेक्ट कर सकता हूं (बशर्ते कि इसमें "सही सामान है" - सीडीआई के साथ यह क्या है, बस एक नो-आर्ग कंस्ट्रक्टर? ), जबकि मुझे इसका उपयोग @ManagedBeanकरना है अगर मैं इसे सादे के साथ इंजेक्ट करना चाहता हूं? JSF?
मैट बॉल

3
@MattBall मैट सालों बाद, क्या आप इस माइग्रेशन पर टिप्पणी कर सकते हैं?
कोरे तुगे

5
@KorayTugay मैंने जून 2011 से इस कोड को नहीं छुआ था लेकिन मैंने CDI पर स्विच कर लिया था और चीजें ठीक काम कर रही थीं। यदि आपने उन्हें प्राप्त किया है, तो मेरी स्मृति में किसी भी विशिष्ट प्रश्न का उत्तर देने में मुझे खुशी होगी।
मैट बॉल

170

सीडीआई का उपयोग करें।

JSF 2.3 के अनुसार, @ManagedBeanहै पदावनत1417 को भी देखें । इस का अर्थ है कि अब और चयन करने के लिए एक कारण नहीं है कि @ManagedBeanअधिक @Named। यह पहली बार मोअज़रा 2.3.0 बीटा संस्करण m06 में लागू किया गया था।

यहां छवि विवरण दर्ज करें


इतिहास

मुख्य अंतर यह @ManagedBeanहै कि जेएसएफ ढांचे द्वारा प्रबंधित किया जाता है और केवल @ManagedPropertyजेएसएफ प्रबंधित बीन्स के लिए उपलब्ध है। @NamedCDI ढांचे के माध्यम से आवेदन सर्वर (कंटेनर) द्वारा प्रबंधित और के माध्यम से है @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.ViewScopedCDI को आसान बनाकर इसे आसान बना दिया है ताकि आप बस ऐसा कर सकें @Named @ViewScoped, हालाँकि यह windowIdURL के परिणाम के लिए एक बदसूरत अनुरोध पैरामीटर को जोड़ता है , वह भी सादे वेनिला पेज-टू-पेज नेविगेशन पर। 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 के लिए किया था। यह भी देखें कि टॉमकैट में सीडीआई कैसे स्थापित करें?


4
मैंने बनाया है beans.xml, @ManagedBeanबैकिंग बीन्स को @Namedपरिवर्तित @ManagedPropertyकिया है , और परिवर्तित किया है @Inject। दुनिया के साथ सब ठीक है। हालाँकि, यदि मैं अपने @EJBएनोटेशन को बदल देता हूँ, तो संदेश के साथ @Injectपरिनियोजन विफल हो जाता है ( org.jboss.weld.exceptions.DeploymentException) WELD-001408 Injection point has unsatisfied dependencies। क्या मुझे वास्तव में @Injectनो-इंटरफ़ेस EJBs को @Namedसेम में इंजेक्ट करने के लिए उपयोग करना चाहिए, या क्या मुझे साथ रहना चाहिए @EJB? EJB को EJB JAR में पैक किया जाता है, उसी EAR में WAR के रूप में जिसमें मेरी CDI बीन्स होती हैं।
मैट बॉल

यह सिर्फ काम करना चाहिए। क्या आप अभी भी वर्तमान वेल्ड संस्करण के साथ इस समस्या का सामना कर रहे हैं?
बालुसक

काश, मैं नहीं कह सकता। यह प्रश्न 2 नियोक्ताओं और> 2 साल पहले से है। Bozho के उत्तर पर मेरी पुरानी टिप्पणी के आधार पर, मुझे CDI / पर स्विच करना होगा @Named
मैट बॉल

"MyFaces CODI ने JSF के javax.faces.bean.ViewScoped को पूरी तरह से पारदर्शी बनाकर इसे आसान बना दिया है, ताकि आप बस कर सकें @Named @ViewScoped, हालाँकि, URL करने के लिए एक बदसूरत windowId अनुरोध पैरामीटर को जोड़ता है, जो सादे वेनिला पेज-टू-पेज नेविगेशन पर भी है।" ध्यान दें कि DeltaSpike के साथ अब यह सही नहीं है। आप विंडो स्कोप की आवश्यकता नहीं है, तो आप dsId और windowId दोनों URL पैरामीटर को अक्षम कर सकते हैं।
JanM

1
@ जान: और इस बीच, ओमनीफेस के पास @ViewScopedJSF 2.0 / 2.1 के लिए JSF 2.2 जैसा भी है : showcase.omnifaces.org/cdi/ViewScoped
BalusC

16

जावा ईई 6 और सीडीआई के साथ आपके पास प्रबंधित बीन्स के लिए अलग विकल्प है

  • @javax.faces.bean.ManagedBeanजेएसआर 314 का संदर्भ है और जेएसएफ 2.0 के साथ पेश किया गया था। मुख्य लक्ष्य एक JSF पृष्ठ के अंदर बीन का उपयोग करने के लिए चेहरे-config.xml फ़ाइल में कॉन्फ़िगरेशन से बचना था।
  • @javax.annotation.ManagedBean(“myBean”) जेएसआर 316 द्वारा परिभाषित किया गया है। यह जावा ईई में अन्यत्र उपयोग के लिए जेएसएफ प्रबंधित बीन्स को सामान्य करता है
  • @javax.inject.Named(“myBean”) लगभग वही हैं, जो ऊपर दिए गए हैं, सिवाय इसके कि आपको जीआई को सक्रिय करने के लिए वेब / WEB-INF फ़ोल्डर में एक बीन्स। xml फ़ाइल की आवश्यकता है।

1
पहले दो में क्या अंतर है?
मैट बॉल

पहला एनोटेशन का लक्ष्य JSF में उपयोग के लिए चेहरे-config.xml में बीन कॉन्फ़िगरेशन को बदलना / करना था। दूसरा एक अवधारणा को "जावा ee 6 कंटेनर" में कॉपी करता है। इसके और भी कार्य हैं (जैसे @PostConstruct और @PreDestroy एनोटेशन), लेकिन JSF पेज (एक्सप्रेशन लैंग्वेज के साथ) भी उपलब्ध है।
h2mch

1
आपको beans.xmlफ़ाइल की आवश्यकता क्यों है ? क्या यह आज भी सच है?
थोफिर

2
नहीं, JavaEE7 के साथ आपको किसी भी अधिक बीन्स की आवश्यकता नहीं है। देख docs.oracle.com/javaee/7/tutorial/doc/cdi-adv001.htm
h2mch

1
JavaEE7 के साथ आपको सेम की आवश्यकता नहीं है। xml: docs.oracle.com/javaee/7/tutorial/cdi-adv001.htm (सही लिंक) blogs.oracle.com/theaquarium/entry/… (Default.I जावा में सक्षम) ईई 7)
एम। आतिफ रियाज़

2

मैं ग्लासफिश 3.0.1 में सीडीआई का उपयोग कर रहा था, लेकिन इसे काम पर लाने के लिए मुझे सीम 3 फ्रेमवर्क (वेल्ड) का आयात करना पड़ा। यह बहुत अच्छी तरह से काम किया।

ग्लासफिश में 3.1 सीडीआई ने काम करना बंद कर दिया और सीम वेल्ड ने इसके साथ काम करना बंद कर दिया। मैंने इस पर एक बग खोला, लेकिन इसे अभी तक तय नहीं देखा है। मुझे अपने सभी कोड को javax.faces का उपयोग करके परिवर्तित करना था। * एनोटेशन लेकिन मुझे एक बार सीडीआई में वापस जाने की योजना है क्योंकि वे इसे काम कर रहे हैं।

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


-1

CDI में स्थानांतरित होने का एक अच्छा कारण: आपके पास एक सामान्य सत्र-स्कूप्ड संसाधन (उदाहरण के लिए उपयोगकर्ता प्रोफ़ाइल) @Injectहो सकता है, दोनों JSF प्रबंधित बीन्स और REST सेवाओं (जैसे, जर्सी / JAX-RS) में एड।

दूसरी ओर, @ViewScopedJSF के साथ चिपके रहने के लिए एक आकर्षक कारण है @ManagedBean- विशेष रूप से महत्वपूर्ण AJAX के साथ कुछ भी करने के लिए। सीडीआई में इसके लिए कोई मानक प्रतिस्थापन नहीं है।

लगता है कि यह @ViewScopedसीडीआई बीन्स के लिए एक समान एनोटेशन के लिए कुछ समर्थन हो सकता है , लेकिन मैंने इसके साथ व्यक्तिगत रूप से नहीं खेला है।

http://seamframework.org/Seam3/FacesModule

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