स्प्रिंग स्कॉप्ड प्रॉक्सी बीन


98

क्या कोई स्प्रिंग @ScopedProxyएनोटेशन के उपयोग की व्याख्या कर सकता है ? मैंने सोचा कि यह सत्र scoped सेम के साथ कुछ करना है, लेकिन मुझे यकीन नहीं है कि क्या।

स्कोप के मेरे उपयोग में, मैंने सत्र स्कॉप्ड बीन्स का उपयोग @ScopedProxyएनोटेशन के बिना किया है (या अनोप स्कोप किए गए प्रॉक्सी के बिना), इसलिए मुझे वास्तव में यकीन है कि इसे ठीक से कैसे उपयोग किया जाए।


बाहर की जाँच सेम प्रलेखन । सत्र एक स्कोप में से एक है , लेकिन केवल एक ही नहीं है।
गस

1
@Gus, मैं scopes के बारे में जानता हूं, बस यकीन नहीं होता कि scoped प्रॉक्सी किस तरह से खेलता है
Jeff Storey

1
धारा ४.४.४.५ मेरी राय में एक स्कोप्ड प्रॉक्सी क्या करता है, इसकी बहुत अच्छी व्याख्या है। - दो उदाहरणों के बीच का बिट महत्वपूर्ण हिस्सा है।
गस

2
हाँ जो इसे समझाता है, धन्यवाद। यदि आप उस प्रश्न का उत्तर जोड़ना चाहते हैं जिसे मैं स्वीकार करूंगा।
जेफ मंजरी

जवाबों:


248

स्प्रिंग डॉक्स की धारा 3.4.4.5 इसे बहुत अच्छी तरह से समझाती है:

(कृपया ध्यान दें कि निम्नलिखित 'उपयोगकर्ताप्रभारी' की परिभाषा के अनुसार यह अपूर्ण है):

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>

<bean id="userManager" class="com.foo.UserManager">
    <property name="userPreferences" ref="userPreferences"/>
</bean>

उपरोक्त विन्यास से यह स्पष्ट होता है कि सिंगलटन बीन 'userManager' को HTTP सत्र-स्कॉप्ड बीन 'userPreferences' के संदर्भ में इंजेक्ट किया जा रहा है। यहाँ मुख्य बिंदु यह है कि 'userManager' बीन एक सिंगलटन है ... यह कंटेनर के अनुसार एक बार बिल्कुल ठीक किया जाएगा , और इसकी निर्भरता (केवल इस मामले में, 'userPreferences' सेम) को केवल एक बार (एक बार ) इंजेक्ट किया जाएगा! ) का है

इसका मतलब यह है कि 'userManager' (वैचारिक रूप से) कभी भी केवल उसी 'userPreferences' ऑब्जेक्ट पर काम करता है, वह वही है जिसे मूल रूप से इंजेक्ट किया गया था।

यह वह नहीं है जो आप चाहते हैं कि जब आप एक HTTP सत्र-स्कैन की हुई बीन को एक सहयोग वस्तु (आमतौर पर) में निर्भरता के रूप में इंजेक्ट करते हैं। बल्कि, हम जो चाहते हैं, वह प्रति कंटेनर एक एकल 'उपयोगकर्ता प्रबंधक' ऑब्जेक्ट है , और फिर, एक HTTP सत्र के जीवनकाल के लिए, हम एक 'उपयोगकर्ताप्रबंध' ऑब्जेक्ट को देखना और उपयोग करना चाहते हैं जो HTTP सत्र के लिए विशिष्ट है

इसके बजाय आपको जो कुछ भी चाहिए वह किसी प्रकार की वस्तु को इंजेक्ट करना है जो सटीक सार्वजनिक इंटरफ़ेस को UserPreferences वर्ग के रूप में उजागर करता है (आदर्श रूप से एक ऑब्जेक्ट जो कि UserPreferences उदाहरण है) और यह स्मार्ट होने के लिए पर्याप्त है और वास्तविक UserPreferences ऑब्जेक्ट को लाने में सक्षम है जो भी अंतर्निहित स्कूपिंग तंत्र हमने चुना है (HTTP अनुरोध, सत्र, आदि) से। फिर हम इस प्रॉक्सी ऑब्जेक्ट को 'userManager' बीन में सुरक्षित रूप से इंजेक्ट कर सकते हैं, जो इस बात से अनजान होगा कि UserPreferences संदर्भ जो इसे पकड़े हुए है वह प्रॉक्सी है

हमारे मामले में, जब एक UserManager उदाहरण निर्भरता-इंजेक्ट किए गए UserPreferences ऑब्जेक्ट पर एक विधि का आह्वान करता है, तो यह वास्तव में प्रॉक्सी पर एक विधि को लागू करेगा ... प्रॉक्सी तब बंद हो जाएगा और वास्तविक UserPreferences ऑब्जेक्ट (इस मामले में) से प्राप्त करेगा। HTTP सत्र, और पुनः प्राप्त वास्तविक UserPreferences ऑब्जेक्ट पर विधि मंगलाचरण को सौंपें।

इसीलिए आपको अनुरोध करते समय निम्न, सही और पूर्ण, कॉन्फ़िगरेशन की आवश्यकता होती है- सहयोग सत्र, और- GlobalSession-scoped सेम को सहयोग करने वाली वस्तुओं में:

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session">
    <aop:scoped-proxy/>
</bean>

<bean id="userManager" class="com.foo.UserManager">
    <property name="userPreferences" ref="userPreferences"/>
</bean>

तो जब मैं @ScopedProxy एनोटेशन का उपयोग करता हूं, तो एक प्रॉक्सी स्वचालित रूप से उपयोग किया जाएगा, और यह सब है? ScopedProxy का अर्थ है -> इस वर्ग का उपयोग न करें जैसा कि यह है, इसके लिए प्रॉक्सी का उपयोग करें?
कोरा तुगे

3
मैं वसंत-वेब का उपयोग कर रहा हूं: 4.3.3 और ऐसा लगता है कि एनोटेशन @ScopedProxyको @RequestScopeअन्य लोगों के साथ बदल दिया गया था । आप यहाँ उदाहरण देख सकते हैं: logicbig.com/tutorials/spring-framework/spring-core/…
adebasi

1
हम कह सकते हैं कि जब नोटेशन @Scope(value="session", proxyMode = ScopedProxyMode.TARGET_CLASS)का उपयोग किया जाता है, तो स्प्रिंगएमवीसी ऑटोवेड के लिए WebApplicationContext का उपयोग नहीं करता है, इसके बजाय यह प्रॉक्सी बनाने के लिए CGLIB का उपयोग करता है। उदाहरण के साथ यहाँ अन्य विवरण बाहर
Kurapika

0

यहाँ और स्प्रिंग डॉक्यूमेंटेशन में निर्दिष्ट कई अलग-अलग विकल्पों को आज़माने के बाद, मैंने किसी कारण से स्प्रिंग एमवीसी का पता लगाया है, जब आप @Controller एनोटेशन का उपयोग करते हैं और जहाँ आपके वेबैप में एक से अधिक ऐसे नियंत्रक होते हैं, तो इसका उपयोग स्वेच्छा से नियंत्रक द्वारा किया जाता है। @RestController (मान = "UniqueControllerv1") के एनोटेशन को संशोधित किया, समस्या हल हो गई है।

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