2010-08-15 3 views
30

क्या कोई साधारण शर्तों में ProxyFactoryBean समझा सकता है? मुझे लगता है कि यह बहुत सारे स्थानों को उद्धृत किया जा रहा है।वसंत में ProxyFactoryBean

+2

क्या आपने http://www.javalobby.org/java/forums/t44746.html में "ग्लूइंग इट ऑल टुगदर" देखा है? – trashgod

उत्तर

44

ProxyFactoryBean का उपयोग मौजूदा लक्ष्य बीन में इंटरसेप्टर तर्क लागू करने के लिए किया जाता है, ताकि जब उस बीन पर विधियों को लागू किया जाए, तो उस विधि कॉल के पहले और बाद में इंटरसेप्टर निष्पादित किए जाते हैं। यह आस्पेक्ट ओरिएंटेड प्रोग्रामिंग (एओपी) का एक उदाहरण है।

यह एक साधारण उदाहरण का उपयोग करके सबसे अच्छा समझाया गया है। एओपी के लिए क्लासिक उपयोग-केस एक विधि कॉल के परिणामस्वरूप कैशिंग लागू करना है।

<bean id="targetService" class="com.x.MyClass"/> 

<bean id="cachingInterceptor" class="com.x.MyCachingInterceptor"/> 

<bean id="cachedService" class="org.springframework.aop.framework.ProxyFactoryBean"> 
    <property name="target" ref="targetService"/> 
    <property name="interfaces"> 
     <list>    
      <value>com.x.MyService</value> 
     </list> 
    </property> 
    <property name="interceptorNames"> 
     <list> 
      <value>cachingInterceptor</value> 
     </list> 
    </property> 
</bean> 

हम प्रकार com.x.MyClass है, जो इंटरफेस com.x.MyService लागू करता है की एक सेम targetService है: यह इस प्रकार है ProxyFactoryBean का उपयोग कर तार हो सकता है। हमारे पास एक इंटरसेप्टर बीन भी है जिसे cachingInterceptor कहा जाता है, जो इंटरफेस org.aopalliance.intercept.MethodInterceptor लागू करता है।

यह कॉन्फ़िगरेशन cachedService नामक एक नया बीन उत्पन्न करेगा, जो MyService इंटरफ़ेस लागू करता है। उस ऑब्जेक्ट पर विधियों के लिए किसी भी कॉल को पहले cachingInterceptor ऑब्जेक्ट की invoke() विधि के माध्यम से पारित किया जाएगा, जो इस मामले में अपने आंतरिक कैश में पिछली विधि कॉल के परिणामों की तलाश करेगा। यह या तो कैश किए गए परिणाम को वापस कर देगा, या विधि कॉल को targetService पर अनुचित विधि पर जाने की अनुमति देगा।

targetService स्वयं कुछ भी नहीं जानता है, यह पूरी तरह से इस एओपी सामान से अनजान है।

ProxyFactoryBean विभिन्न कारणों से प्रॉक्सियों को उत्पन्न करने के लिए आंतरिक रूप से वसंत के भीतर आंतरिक रूप से उपयोग किया जाता है (उदाहरण के लिए स्टब्स, लेनदेन प्रबंधन को रिमोट करना), लेकिन यह एप्लिकेशन तर्क में भी उपयोग के लिए बिल्कुल उपयुक्त है।

+0

यहां जोड़ने के लिए सिर्फ एक चीज यह है कि यदि हमारे पास कई 'इंटरसेप्टरनाम' हैं तो उन्हें इस तरह के क्रम में लागू किया जाता है, कि सूची में पहला व्यक्ति आमंत्रण को रोकने के लिए पहला है और इसी तरह। – Vic

6

प्रॉक्सी फैक्ट्रीबीन मौजूदा बीन के पहलुओं को लागू करता है। आप अपने मौजूदा बीन (लक्ष्य बीन) के साथ शुरू करते हैं, जो आपके द्वारा प्रदान किए जाने वाले पहलुओं को जोड़ने के लिए "लपेटें" वसंत करता है। लौटा बीन आपके मूल बीन के समान इंटरफ़ेस है, लेकिन लक्ष्य बीन के तरीकों के आस-पास के अतिरिक्त पहलुओं के साथ।