2012-06-21 11 views
37

स्प्रिंग-एमवीसी सिंगलेट्स में सभी नियंत्रक हैं और विभिन्न सत्रों और अनुरोधों के बीच साझा किए जाते हैं?स्प्रिंग-कंट्रोलर का दायरा और इसके उदाहरण-चर

यदि हां, तो मुझे लगता है कि

public String name; 

की तरह एक वर्ग-चर सभी अनुरोधों और सत्र के लिए एक ही हो सकता है? ताकि यदि उपयोगकर्ता एक्स एक अनुरोध करता है और name को पर सेट किया जा रहा है तो पॉल, उपयोगकर्ता जेड में पॉल के रूप में भी विशेषता है?

मेरे मामले में मुझे लगता है कि व्यवहार नहीं करना चाहते, लेकिन सोचा कि अगर वहाँ एक और अधिक आसान है, या अधिक क्लीनर OOP-तरीका है सत्र/अनुरोध-चर के लिए तो session.getAttribute()/request.getAttribute()

उत्तर

53

अपने पहले सवाल का जवाब करने के लिए: हाँ , स्प्रिंग एमवीसी नियंत्रक डिफ़ॉल्ट रूप से सिंगलेट हैं। ऑब्जेक्ट फ़ील्ड को सभी अनुरोधों और सभी सत्रों के लिए हमेशा के लिए साझा और दृश्यमान किया जाएगा।

हालांकि बिना किसी सिंक्रनाइज़ेशन के आप किसी भी तरह के समवर्ती मुद्दों (दौड़ की स्थिति, दृश्यता) में भाग सकते हैं। इस प्रकार आपके क्षेत्र में volatile (और private, वैसे भी) दृश्यता मुद्दों से बचने के लिए संशोधक होना चाहिए।

अपने मुख्य प्रश्न पर वापस स्प्रिंग में आप उपयोग कर सकते अनुरोध (4.5.4.2 Request scope देखें) और सत्र-दायरे (देखें: 4.5.4.3 Session scope) सेम। आप उन्हें नियंत्रकों और किसी भी अन्य सेम (यहां तक ​​कि सिंगलेट्स!) में इंजेक्ट कर सकते हैं, लेकिन वसंत सुनिश्चित करता है कि प्रत्येक अनुरोध/सत्र में एक स्वतंत्र उदाहरण होता है।

केवल बात को याद है जब एकमात्र में अनुरोध और सत्र-दायरे सेम इंजेक्शन लगाने के लिए उन्हें scoped प्रॉक्सी (उदाहरण के 4.5.4.5 Scoped beans as dependencies से लिया गया) में रैप करने के लिए है:

<!-- an HTTP Session-scoped bean exposed as a proxy --> 
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"> 

    <!-- instructs the container to proxy the surrounding bean --> 
    <aop:scoped-proxy/> 
</bean> 
+0

+1 नोट: "यहां तक ​​कि सिंगलेट्स!" इंजेक्शन बीन्स –

+0

@ सेनपैट्रिकफ्लॉइड ऑटो-प्रॉक्सीइंग की आवश्यकता है: हाँ, यह इतना महत्वपूर्ण है कि मैंने स्प्रिंग डॉक्स से एक उदाहरण जोड़ा, धन्यवाद! –

8

हाँ, वसंत-MVC में नियंत्रक एकमात्र कर रहे हैं। एकाधिक अनुरोधों के बीच आपकी कक्षा चर साझा की जाती है और परिणामस्वरूप अस्पष्टता हो सकती है। आप ऐसी अस्पष्टता से बचने के लिए अपने नियंत्रक के ऊपर @ स्कोप ("अनुरोध") एनोटेशन का उपयोग कर सकते हैं।

+0

स्पष्टीकरण के साथ कुछ उदाहरण बहुत अच्छा होगा। – Nilambar

+0

@ नियंत्रक पब्लिक क्लास टेस्टक्लास { \t निजी स्ट्रिंग नाम; \t @RequestMapping ("/") \t सार्वजनिक स्ट्रिंग DISPLAYNAME() { \t \t अगर (this.name = अशक्त!) { \t \t \t this.name = "एबीसी"; \t \t} अन्य { \t \t यह .name = "XYZ"; \t \t} SystemOut.println (नाम); \t \t इसे वापस करें।नाम; \t} \t सार्वजनिक स्ट्रिंग getName() { \t \t वापसी का नाम; \t} \t सार्वजनिक शून्य सेटनाम (स्ट्रिंग नाम) { \t \t this.name = name; \t} } –

+0

मेरे पिछले संपादन को जारी रखने में .. पहले अनुरोध के लिए यह एक्सवाईजेड प्रिंट करेगा लेकिन एक और समानांतर अनुरोध के लिए यह एबीसी प्रिंट करेगा लेकिन आदर्श रूप से यदि दो उपयोगकर्ता दो अलग-अलग अनुरोध जारी कर रहे हैं तो उन्हें दोनों को XYZ देखना चाहिए। @ स्कोप ("अनुरोध") बनाकर हमें वांछित परिणाम मिलेगा। अगर मैं कहीं गलत हो गया तो कृपया मुझे बताएं –

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