java - वसंत एओपी में प्रॉक्सी का उपयोग करें




spring aop (3)

मैं एक किताब पढ़ रहा हूं, जो स्प्रिंग एओपी में एस्पेक्टजे समर्थन को सक्षम करने के बारे में बात करता है।

पुस्तक से लिया गया एक अनुच्छेद नीचे दिया गया है:

स्प्रिंग आईओसी कंटेनर में AspectJ एनोटेशन समर्थन को सक्षम करने के लिए, आपको केवल एक खाली XML तत्व एओपी परिभाषित करना होगा: पहलू-ऑटोप्रोक्सी आपकी बीन कॉन्फ़िगरेशन फ़ाइल में। फिर, वसंत स्वचालित रूप से आपके किसी भी बीन्स के लिए प्रॉक्सी बनायेगा जो आपके AspectJ पहलुओं से मेल खाते हैं।

जिन मामलों में इंटरफेस उपलब्ध नहीं हैं या किसी एप्लिकेशन के डिज़ाइन में उपयोग नहीं किए जाते हैं, उनके लिए CGLIB पर भरोसा करके प्रॉक्सी बनाना संभव है। CGLIB को सक्षम करने के लिए, आपको एओपी: aspectj-autoproxy में विशेषता प्रॉक्सी-targetclass = true सेट करने की आवश्यकता है।


मैं दूसरा अनुच्छेद प्राप्त करने में सक्षम नहीं हूं। ' इंटरफेस उपलब्ध नहीं हैं ' का क्या अर्थ है। क्या कोई इसे उदाहरण के साथ चित्रित कर सकता है?


मुझे here एक ब्लॉग मिला जो स्पष्ट रूप से बताता है कि एओपी, कैशिंग और लेनदेन रनटाइम प्रॉक्सी कक्षाओं का उपयोग कैसे करता है।

इंटरफ़ेस को कोडिंग नहीं करते समय (ब्लॉग के अनुभाग से उद्धरण ' क्या होगा यदि बीन क्लास किसी इंटरफ़ेस को लागू नहीं करता है? ): -

डिफ़ॉल्ट रूप से, यदि आपका बीन एक इंटरफेस को लागू नहीं करता है, तो वसंत तकनीकी विरासत का उपयोग करता है: स्टार्टअप समय पर, एक नई कक्षा बनाई जाती है। यह आपके बीन वर्ग से विरासत में मिलता है और बाल विधियों में व्यवहार जोड़ता है। इस तरह के प्रॉक्सी उत्पन्न करने के लिए, स्प्रिंग एक तीसरी पार्टी लाइब्रेरी का उपयोग करता है जिसे क्लग्ब कहा जाता है।


वसंत एओपी एक गैर-घुसपैठ के तरीके में क्रॉस-कटिंग चिंताओं (उर्फ पहलुओं) को लागू करने के लिए एक तंत्र के रूप में प्रॉक्सी का व्यापक उपयोग करता है, विचार मूल रूप से प्रॉक्सी का उपयोग रैपर के रूप में करता है जो मूल व्यवहार को समृद्ध करता है, यानी लेनदेन क्षमताओं को जोड़ता है।

यह प्राप्त करने के लिए मूल ऑब्जेक्ट एक इंटरफ़ेस लागू करता है या नहीं, इस पर निर्भर करता है कि दो विकल्प हैं।

पहले मामले में (मूल वस्तु कम से कम एक इंटरफ़ेस लागू करती है) प्रतिबिंब API की गतिशील प्रॉक्सी क्षमताओं का उपयोग प्रॉक्सी ऑब्जेक्ट बनाने के लिए किया जाता है जो मूल ऑब्जेक्ट को उसी इंटरफ़ेस को लागू करता है और इसलिए प्रॉक्सी का उपयोग किया जा सकता है।

दूसरे मामले में (मूल वस्तु किसी भी इंटरफ़ेस को लागू नहीं करती है), इसलिए एक और विस्तृत चाल का उपयोग किया जाना चाहिए, और यह तब होता है जब CGLIB प्रकट होता है। प्रोजेक्ट पेज के मुताबिक "सीजीएलआईबी का उपयोग जावा कक्षाओं को बढ़ाने और रनटाइम पर इंटरफेस लागू करने के लिए किया जाता है"। तो इस मामले में चाल में प्रॉक्सी उत्पन्न होती है जो मूल वस्तु को बढ़ाती है और इसलिए इसका उपयोग किया जा सकता है।


स्प्रिंग एओपी या तो आपकी लक्षित वस्तुओं के लिए प्रॉक्सी बनाने के लिए जेडीके गतिशील प्रॉक्सी या सीजीएलबीबी का उपयोग करता है।

स्प्रिंग प्रलेखन के अनुसार, यदि आपका लक्ष्य कम से कम एक इंटरफ़ेस लागू करता है, तो एक जेडीके गतिशील प्रॉक्सी का उपयोग किया जाएगा। हालांकि यदि आपका लक्षित ऑब्जेक्ट किसी भी इंटरफेस को लागू नहीं करता है तो एक CGLIB प्रॉक्सी बनाया जाएगा।

इस प्रकार आप CGLIB प्रॉक्सी के निर्माण को मजबूर कर सकते हैं (प्रॉक्सी-लक्ष्य-वर्ग = " सत्य " सेट करें):

 <aop:config proxy-target-class="true">
    <!-- other beans defined here... -->
 </aop:config>

AspectJ और इसके ऑटोपॉक्सी समर्थन का उपयोग करते समय आप CGLIB प्रॉक्सी को भी मजबूर कर सकते हैं। यह वह जगह है जहां <aop:aspectj-autoproxy> का उपयोग किया जाता है और यहां भी "प्रॉक्सी-लक्ष्य-वर्ग" को सत्य पर सेट किया जाना चाहिए:

<aop:aspectj-autoproxy proxy-target-class="true"/>

कृपया अधिक जानकारी के लिए वसंत दस्तावेज़ीकरण के साथ पहलू ओरिएंटेड प्रोग्रामिंग के प्रॉक्सीइंग तंत्र खंड देखें।







aspectj