2011-11-08 17 views
8

मुझे कुछ परेशानी हो रही है कि गुइस के सिंगलटन तत्काल काम कैसे करते हैं। मैंने उपलब्ध दस्तावेज (यहां - http://code.google.com/p/google-guice/wiki/Scopes) पढ़ा है, लेकिन मैं अभी भी कुछ चीजों को नहीं समझ सकता:गुइस उत्सुक/आलसी सिंगलटन तत्काल

1) मैंने टोइसैट के साथ गुइस को एकीकृत किया है, और मैंने ServletModule में कुछ बाइंडिंग सेट की हैं:

bind(MyServlet.class).asEagerSingleton(); 
serve("myUrl").with(MyServlet.class); 
serve("myOtherUrl").with(MyOtherServlet.class); 

(जहां MyOtherServlet वर्ग यह ऊपर एक @Singleton एनोटेशन है) मेरे यहाँ इरादा, दो सर्वलेट्स है, जहां एक बेसब्री से instantiated है जबकि अन्य नहीं है था। हालांकि ऐसा लगता है कि "सेवा ... के साथ ..." लाइन स्वचालित रूप से servlets ऑब्जेक्ट्स को तुरंत चालू करती है, भले ही वह वर्ग एक उत्सुक सिंगलटन के रूप में बाध्य न हो। ऊपर दिए गए लिंक ने चरण के तहत चल रहे गुइस के बीच अंतर का उल्लेख किया है। विकास और चरण। प्रोडक्शन - हालांकि यह तब भी हुआ जब मैंने स्पष्ट रूप से स्टेज का उपयोग किया। विकास (जो वैसे भी डिफ़ॉल्ट है)। क्या इससे बचने का कोई तरीका है?

2) (जारी रखें 1) यह सुनिश्चित करने की कोशिश कर रहा है कि MyServlet पहले तत्काल हो जाता है, भले ही सभी servlets उत्सुकता से तत्काल हो जाएं, मैंने इंजेक्टर बनाने के दौरान मॉड्यूल (और बाइंडिंग स्टेटमेंट) के क्रम को संशोधित किया है, ताकि MyServlet के लिए बाध्यकारी पहले प्रकट होता है हालांकि, मैंने पाया है कि यह अभी भी (गैर सर्वलेट वर्ग के) कुछ अन्य बाइंडिंग, फार्म के थे जो की तुलना में बाद instantiated हो जाता है:

bind(MyInterface.class).to(MyClass.class).asEagerSingleton() 

भले ही उन अन्य बाइंडिंग मॉड्यूल/बाइंडिंग क्रम में बाद में दिखाई दिया। मैंने इसमें देखा है, और पाया कि गुइस बस उत्सुक सिंगलेट्स को तत्काल करता है जो "बांध ... ... asEagerSingleton()" के रूप में बाध्य थे, इससे पहले कि यह "बाइंड ... asEagerSingleton()" , और इसलिए मैंने लाइन को संशोधित करके हल किया: बाइंड (MyServlet.class) .asEagerSingleton(); में: बाँध (MyServletDummyInterface.class) करें.अभियान (MyServlet.class) .asEagerSingleton()

और कहा कि वास्तव में काम किया। फिर भी, मैं इसे हल करने के लिए सिर्फ एक डमी इंटरफेस से बचने के बजाय, इसलिए मैं सोच रहा था कि किसी के पास इसका बेहतर समाधान है ..?

3) मेरे पास दो गिइस मॉड्यूल हैं - एक सर्वलेट मॉड्यूल और एक सार मॉड्यूल।)

serve("aUrl").with(SomeServlet.class); 

AbstractModule के कॉन्फ़िगर (निम्नलिखित बाइंडिंग है: ServletModule configureServlets() निम्नलिखित उस में बाध्यकारी है

bind(SomeImpl.class).asEagerSingleton(); 
bind(SomeInterface.class).to(SomeImpl.class).in(Singleton.class); 

साथ ही, SomeServlet वर्ग प्रकार SomeInterface का एक इंजेक्शन क्षेत्र है, और कक्षा के शीर्ष पर @ सिंगलेटन एनोटेशन है।

अब, कोई उम्मीद करेगा कि एक इंजेक्टर बनाने पर, कुछ आईएमएलएल कक्षा तत्काल हो जाएगी, और उसी उदाहरण को कुछ सर्लेट उदाहरण में इंजेक्शन दिया जाएगा। जैसा कि पहले उल्लेख किया गया है, "सेवा ... के साथ ..." कथन से जुड़े सर्लेट भी उत्सुकता से तत्काल प्रतीत होते हैं, लेकिन किसी भी तरह से अभी भी केवल एक ही IIpl ऑब्जेक्ट तत्काल होना चाहिए। फिर भी किसी कारण से, मुझे ऐसा करने पर दो SomeImpl ऑब्जेक्ट्स तुरंत चालू कर दिए गए। इसके चारों ओर एक सा पाने के लिए, मैं कॉन्फ़िगर में दो पंक्तियों मिश्रित(), और बदले ऊपर मैं वहाँ निम्नलिखित लाइनों था:

bind(SomeImpl.class).in(Singleton.class) 
bind(SomeInterface.class).to(SomeImpl.class).asEagerSingleton(); 

और फिर यह ठीक काम किया है, और मैं उसमें केवल एक ही मिला कुछ Iplpl तत्काल।मुझे वास्तव में यह नहीं पता कि स्विच क्यों मायने रखता है - मैं देख सकता हूं कि बाद का तरीका "बेहतर" कैसे है, लेकिन मैं उम्मीद करता हूं कि दोनों सही तरीके से काम करें, इसलिए मैं सोच रहा हूं कि मुझे कुछ गलत हो रहा है .. ?



लंबाई के बारे में क्षमा करें,
मदद के लिए धन्यवाद!

उत्तर

7

1) इससे बचने का कोई तरीका नहीं है, चूंकि गुइस ने init() अपने स्वयं के फ़िल्टर पाइपलाइन के प्रारंभ पर सभी सर्वलेट्स की विधि को कॉल किया है और इस प्रकार उन्हें सभी का निर्माण करता है। यदि आपको वास्तव में ऐसे आलसी प्रारंभिक तर्क की आवश्यकता है, तो आपको इसे सर्वलेट में रखना चाहिए (या एक decoupled सहायक वर्ग का उपयोग करें, या ... आपके उपयोग के मामले के आधार पर कई तरीके हैं)।

2) आम तौर पर कहा गया है कि, गुइस के मॉड्यूल बाइंडिंग घोषित करते हैं, सटीक तत्काल आदेशों के साथ बूटस्ट्रैप परिभाषाओं के लिए डिज़ाइन नहीं किया गया है। यदि आपको ऐसे परिभाषित तत्काल आदेश की आवश्यकता है, तो वस्तुओं को वांछित क्रम में बनाएं और उन्हें bind(...).toInstance(...) के माध्यम से बाध्य करें। यदि आपको स्वयं निर्मित उदाहरणों में इंजेक्शन की आवश्यकता है तो आप requestInjection(...) का उपयोग कर सकते हैं (यदि फ़ील्ड/विधि इंजेक्शन पर्याप्त है, तो यह कन्स्ट्रक्टर इंजेक्शन के लिए अधिक बोझिल है)।

3) गुइस का दायरा बाध्यकारी कुंजी पर लागू होता है, बाध्यकारी मान नहीं, Applying Scopes बताता है कि केवल आपका दूसरा उदाहरण इरादे से क्यों काम कर रहा है।

संबंधित मुद्दे