2010-09-02 13 views
5

यहां एक प्रश्न है: मेरे पास विधि digest(byte[] data) है। यह निजी होना चाहिए, क्योंकि हमें वास्तव में कक्षा के बाहर इसकी आवश्यकता नहीं है, हालांकि अगर मैं इसे सार्वजनिक करता हूं तो मैं मर जाऊंगा, अगर यह मदद करता है।
सवाल यह है: क्या मैं इसे किसी भी तरह से इंटरसेप्टर संलग्न कर सकता हूं? बात यह getBean('MyBean').sign(data) के माध्यम से कहा जाता है जहां पर हस्ताक्षर की तरहनिजी तरीकों पर विधि इंटरसेप्टर

public byte[] sign(byte[] data){ 
    ... 
    b = digest(data); 
    ... 
    return signature; 
} 

Thx ख़ाली है, कि यह getBean('MyBean').digest() की तरह नहीं बुलाया जाता है।

+0

मैंने आपके कोड को प्रारूपित करने का प्रयास किया, लेकिन यह अभी भी अवैध है। कृपया इसे सही ढंग से पेस्ट करें। – Bozho

उत्तर

3

यदि विधि सार्वजनिक है, तो भी स्प्रिंग विधि वाली कॉल को अवरुद्ध नहीं कर सकती है जो विधि वाली वस्तु के भीतर से बनाई गई है। इसे प्राप्त करने के लिए, आपको AspectJ का उपयोग करना होगा।

+0

सही, स्प्रिंग एओपी गतिशील प्रॉक्सी के साथ काम करता है, जिसका अर्थ है कि आप इंटरफ़ेस में प्रकट होने वाली विधियों को केवल अवरुद्ध कर सकते हैं और जब प्रॉक्सी सीधे उजागर विधि को प्रतिनिधि करने में सक्षम होता है। – nkr1pt

+1

देखें http://forum.springsource.org/archive/index.php/t-34372.html – Cid54

+1

यह केवल जेडीके गतिशील प्रॉक्सी के लिए मामला है। स्प्रिंग एओपी सीजीआईएलबी सबक्लास प्रॉक्सी के साथ भी काम कर सकती है, इस मामले में सार्वजनिक तरीकों का आत्म-आमंत्रण ठीक काम करता है। – skaffman

1

पूर्ण AspectJ voodoo का क्रमबद्ध करें, आपको अपनी अवरोध विधि public बनाने की आवश्यकता है। यदि आप digest() अपनी बीन की विधि public के रूप में बेनकाब नहीं करना चाहते हैं, लेकिन फिर भी इंटरसेप्टर्स को लागू करना चाहते हैं, तो मैं पाचन लॉजिक को एक अलग वर्ग में निकालने के लिए अपने कोड को दोबारा लगाने का सुझाव देता हूं जो एक नया पाचन इंटरफ़ेस लागू करता है, और लागू होता है उस पर interceptors।

यह थोड़ा बेकार है, लेकिन यह आपको अपनी चिंताओं को अलग करने के लिए मजबूर करता है, जो बुरी चीज नहीं है।

public interface Digester { 
    public Foo digest(byte[] data); 
} 

class DigesterImpl implements Digester { 
    public Foo digest(byte[] data) {...} 
} 

फिर अपने वसंत कोड में आप एक प्रॉक्सी DigesterImpl अपने वर्ग और कॉल करने के लिए इंजेक्षन:

0

आप क्या चाहते हैं को प्राप्त करने का एक और तरीका है यह डाइजेस्ट() विधि है करने के लिए एक पाचक वर्ग बना सकते हैं और कॉल अवरोधन करने के लिए है यह:

private final Digester digester; 

MyClass(Digester digester) { 
    this.digester = digester; 
} 

public byte[] sign(byte[] data){ 
    ... 
    b = digester.digest(data); 
    ... 
    return signature; 
} 
0

यहाँ समझने के लिए मुख्य बात यह है कि जब Aspect विधि प्रोग्रामिंग का उपयोग कर उस वस्तु संदर्भ प्रॉक्सी पर कॉल किया जाएगा पर कहता है, और इस तरह प्रॉक्सी के रूप में सभी के लिए सौंपने के लिए सक्षम हो जाएगा इंटरसेप्टर (ए dvice) जो कि उस विशेष विधि कॉल के लिए प्रासंगिक हैं।

हालांकि, एक बार कॉल अंत में लक्ष्य वस्तु पर पहुँच गया है, किसी भी प्रणाली को बुलाती है कि वह खुद पर कर सकते हैं, इस तरह के डाइजेस्ट (डाटा) के रूप में, इस संदर्भ के खिलाफ लागू किया जा करने के लिए जा रहे हैं, और नहीं प्रॉक्सी

इसका महत्वपूर्ण प्रभाव है। इसका मतलब यह है कि स्वयं-आमंत्रण का परिणाम किसी विधि आमंत्रण से जुड़ी सलाह में निष्पादित करने का मौका नहीं मिलता है। लेकिन वहाँ यह करने के लिए एक तरीका है:

public byte[] sign(byte[] data){ 
    ... 
    b = (Digester)AopContext.currentProxy()).Digest(Data); 
    ... 
    return signature; 
} 

यह पूरी तरह जोड़ों अपने कोड Spring AOP, और यह वर्ग ही तथ्य यह है कि यह एक AOP संदर्भ है, जो के चेहरे में मक्खियों में इस्तेमाल किया जा रहा है के बारे में पता करता है AOP।

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