CDI में @ApplicationScoped और @Singleton scopes के बीच अंतर क्या है?


92

CDI @ApplicationScopedमें (और javax.inject) @Singletonछद्म गुंजाइश है। उनके बीच क्या अंतर है? इस तथ्य के अलावा कि @ApplicationScopedअनुमानित है, और @Singletonनहीं है।

क्या मैं सिर्फ अपने @Singletonबीन को बदल सकता हूं @ApplicationScoped? क्या @ApplicationScopedबीन के दो (या अधिक) उदाहरण हो सकते हैं?


11
क्या आपने वेल्ड संदर्भ पढ़ा है ? इसके @ApplicationScopedऔर @Singletonइसके अनुभाग 5.4 (पृष्ठ 36) के बीच व्यावहारिक अंतर के बारे में कुछ स्पष्टीकरण है ।
ब्रैंडज़ी जूल 3'11

3
मुझे इस लेख के अंत में मतभेदों का सारांश भी मिल गया है germanescobar.net/2010/04/… उपयोगी
मैट फ़्रीके

1
आप किस सिंगलटन दायरे की बात कर रहे हैं - javax.ejb या javax.inject?
जॉन एमेंट

जवाबों:


29

@Singletonसीडीआई विनिर्देश का हिस्सा नहीं है। यह EJB और javax.inject(JSR-330) का हिस्सा है । यह उल्लेख नहीं किया गया है कि इसका व्यवहार क्या है, इसलिए आप केवल इस बात पर भरोसा कर सकते हैं कि वेल्ड दस्तावेज में क्या लिखा गया है।


11
यह सच नहीं है। एनोटेशन javax.inject.Singleton है। यह सीडीआई का हिस्सा है। यहां देखें: docs.jboss.org/weld/reference/1.0.1-Final/en-US/html_single/…
amorfis

5
@ ग्लैमरिस - मेरे सामने सीडीआई युक्ति है। मैंने इसके कुछ हिस्सों को लागू भी कर दिया है, और इसके बारे में कुछ भी उल्लेख नहीं करता है @Singleton। यह केवल एक उदाहरण में दिखाया गया है, स्पष्टीकरण के बिना। यह सच है कि CDI निर्भर करता है javax.inject, लेकिन सख्ती से यह CDI कल्पना का हिस्सा नहीं है। उस ने कहा, मैंने अपना उत्तर थोड़ा ठीक किया।
बोझाओ

17

संक्षेप में: आप इसे ( @Singletonऔर @ApplicationScoped) भी मिला सकते हैं और यह कुछ परिदृश्यों में समझ में आता है। (और मेरी उम्मीद के मुताबिक काम करता है!)

इसके अतिरिक्त अन्य उत्तरों से मैं अब तक वास्तविक विश्व परिदृश्यों में स्पष्टीकरण के लिए कुछ और बिंदु जोड़ना चाहूंगा।

मेरे लिए यह प्रश्न विकसित हुआ कि कैसे मैं एप्लिकेशन स्टार्टअप पर एक एप्लीकेशन-स्कॉप्ड बीन को तुरंत लागू करने के लिए मजबूर करूं? कुछ चर्चा में मैंने यह कहा था और इसके खिलाफ एक वैध तर्क नहीं मिल सकता है:

बहुत सारे वास्तविक जीवन के परिदृश्यों / सेटअपों में, मैं कहूंगा कि निश्चित रूप से कहना मुश्किल है - एक अमूर्त / मॉडलिंग के दृष्टिकोण से - चाहे कोई चीज हो (या जैसा व्यवहार किया जाएगा / किया जाएगा) एक ईजेबी या एप्लिकेशन-स्कॉप्ड प्रबंधित बीन।

(बहस योग्य लेकिन निर्णायक नहीं) (मेरे दृष्टिकोण से) अब तक इसके खिलाफ: (@ बाल्सक और अन्य सभी: मैं उन्हें निर्णायक रूप से मधुमक्खी देखना चाहूंगा, लेकिन यदि नहीं, तो ऊपर सच हो सकता है और फिर भी तर्क हो सकता है) अभी भी अंतर / फायदे / नुकसान / बुरे / अच्छे व्यवहार पाने के लिए पाठक की मदद करें)

ईजेबी बनाम प्रबंधित बीन

BalusC : यह एक EJB है जो एक प्रबंधित बीन नहीं है, जो काफी अलग है। EJB बैकएंड में चलते हैं और फ्रंटेंड में सेम प्रबंधित करते हैं। EJB लेनदेन के संदर्भ में भी चलते हैं। [...] आप बस प्रबंधित सेम के साथ उद्यम सेम को भ्रमित करते हैं और मैंने अभी बताया है।

परंतु:

मुझे : मुझे लगता है कि आप काफी सही नहीं हैं और अर्थ / उपयोग को ओवरस्टैट कर रहे हैं और यह मेरे लिए बहस योग्य लगता है। http://en.wikipedia.org/wiki/Enterprise_JavaBeans

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

एंटरप्राइज बीन्स के प्रकार

सत्र बीन्स [3] जो "स्टेटफुल", "स्टेटलेस" या "सिंगलटन" [...] हो सकता है

संदेश प्रेरित बीन्स [...]

... जो अभी भी मेरे मामले में सही है।

सिंगलटन ईजेबी बनाम एप्लीकेशन स्कॉप्ड बीन

ताला

BalusC : एक सिंगलटन EJB एक एप्लीकेशन स्कॉप्ड बीन के समान नहीं है। एक सिंगलटन EJB को लॉक / रीड किया जाता है और इस प्रकार आपके द्वारा मन में लिए गए कार्य के लिए संभावित रूप से अक्षम / अति-असंबद्ध। लंबी कहानी छोटी: एक अच्छी जावा ईई पुस्तक को पकड़ो और नौकरी के लिए सही उपकरण का उपयोग करना सीखो। एक रास्ता निश्चित रूप से दूसरा रास्ता नहीं है। यह काम करता है इसका मतलब यह नहीं है कि यह सही उपकरण है। एक स्लेजहेमर एक पेंच को बन्धन करने में सक्षम है, लेकिन यह जरूरी नहीं कि सही उपकरण है :)

परंतु:

(मैं स्लेजहैमर को यहाँ नहीं देख सकता - क्षमा करें ...) यह लॉकिंग डिफॉल्ट्स को जानने के लिए अच्छा है (मुझे इसके बारे में पता नहीं था), लेकिन यह फिर से गलत लगता है: ओरेकल जावा ईई 6 ट्यूटोरियल ऑन मैनेजिंग समवर्ती एक्सेस में एक सिंगलटन सत्र बीन

एक सिंगलटन सेशन बीन बनाते समय, सिंगलटन के बिज़नेस के तरीकों को समवर्ती एक्सेस दो तरीकों से नियंत्रित किया जा सकता है: कंटेनर-प्रबंधित कॉन्सिरेन्सी और बीन-मैनेजेड कॉन्सैबरी। [...]

हालाँकि, डिफ़ॉल्ट रूप से, एकल-पात्र कंटेनर-प्रबंधित कॉन्सेप्ट का उपयोग करते हैं, @ConcurrencyManagement (CONTAINER) एनोटेशन को स्पष्टता प्रबंधन प्रकार सेट करने के लिए सिंगलटन के वर्ग स्तर पर जोड़ा जा सकता है


मिश्रण करने से वेल्ड का उपयोग नहीं किया जाता है: ऐप लोड करते समय अपवाद: CDI परिभाषा विफलता: WELD-000046: अधिकांश पर एक सीमा को निर्दिष्ट किया जा सकता है [एन्हांसमेंटअनॉटनेटेड TypeImpl] सार्वजनिक ApplicationScopop Singleton MyClass। Javax.inject.Singleton का उपयोग करना।
sgflt

10

आमतौर पर जब आप किसी वस्तु का केवल एक ही उदाहरण रखना चाहते हैं, तो आपको शायद @ApplicationScopedएनोटेशन का उपयोग करना चाहिए - ऐसी वस्तु अनुमानित है और इस तरह से आउट-ऑफ-द-बॉक्स भी ठीक से क्रमबद्ध हो सकती है।

दूसरी ओर, ऐसे कई मामले भी हैं, जहाँ आप कक्षा का केवल एक उदाहरण चाहते हैं, लेकिन इस तरह के वर्ग को अनुमानित नहीं किया जा सकता है (जैसे कि अंतिम होने के कारण) - फिर @Singletonबचाव है। क्योंकि Singletonएक छद्म गुंजाइश है और किसी भी "सामान्य" दायरे की तरह अनुमानित नहीं है।


मैं इसे नीचा दिखा रहा हूं क्योंकि यह बहुत अस्पष्ट है। मैं पाँच साल के लिए जावा ईई में कोडिंग कर रहा हूं, ट्यूटोरियल ले रहा हूं, और किताबें पढ़ रहा हूं, लेकिन मेरे पास कोई स्पष्ट विचार नहीं है कि जब आप कहते हैं कि "ऐसी वस्तु का अनुमान लगाया गया है", "ठीक से क्रमबद्ध भी हो सकता है", और "छद्म-" गुंजाइश "। मुझे यह जानकर अच्छा लगेगा कि इसका क्या मतलब है, क्योंकि यह लगता है कि आप जानते हैं कि आप किस बारे में बात कर रहे हैं, लेकिन जैसा कि लिखा गया है कि मैं कल्पना नहीं कर सकता कि आपका जवाब सबसे जावा ईई डेवलपर्स की मदद करेगा।
डेविड ऑक्ट

2
उन्होंने कहा, मुझे पता है कि ईजेबी अनुमानित हैं। मेरी उलझन आंशिक रूप से सिंगलेट्स के लिए आपके द्वारा किए जा रहे भेद के आसपास है।
डेविड ऑक्ट्स

9

@SingletonJSR-299 में सिंगलटन सत्र बीन्स को संदर्भित किया गया है ( javax.ejb.Singleton, नहीं javax.inject.Singleton), जेएसआर-299 एक अंतर्निहित दायरे में सिंगलटन नामक सेम प्रबंधित नहीं है।

आप अपने सर्वर में पा सकते हैं कि @ApplicationScopedएक-प्रति ईएआर या एक-प्रति वार / ईजेबी-जार है क्योंकि यह विनिर्देश में स्पष्ट नहीं है, लेकिन आपको निश्चित रूप से प्रति जेवीएम के एक होने की उम्मीद नहीं करनी चाहिए।


7

एक और अंतर है: @Singletonबीन डिफाइनिंग एनोटेशन नहीं है, क्योंकि Singletonस्कोप एक सामान्य स्कोप नहीं है। फिर @ApplicationScopedबीन परिभाषित एनोटेशन है।

CDI 1.1 कल्पना के साथ: जब डिस्कवरी-मोड में एप्लिकेशन = एनोटेट किया जाता है, तो वेल्ड इसके साथ सेम की पहचान नहीं करता है @Singletonऔर इसे लोड नहीं करता है


2

एक प्रमुख अंतर जो आप अपनी क्लास को डिफॉल्ट कंस्ट्रक्टर के साथ लिख सकते हैं javax.inject.Singleton, का उपयोग करते समय निजी एक्सेस संशोधक होता है , लेकिन आपके क्लास का उपयोग करते समय कम से कम डिफॉल्ट एक्सेस संशोधक के साथ डिफ़ॉल्ट कंस्ट्रक्टर होना चाहिए javax.enterprise.context.ApplicationScopedऔर यह JBOSS 6.1 GA Finalकार्यान्वयन है


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