2012-04-20 21 views
10

मैं बहुत की तरह एक विधि है कहते हैं:एनोटेट तर्क के लिए स्प्रिंग AOP pointcut

public void method(@CustomAnnotation("value") String argument) 

वहाँ एक pointcut अभिव्यक्ति है कि @CustomAnnotation साथ एनोटेट तर्क के साथ सभी तरीकों का चयन कर सकते है? यदि ऐसा है तो मैं "मूल्य" तर्क पर पहुंच प्राप्त कर सकता हूं?

उत्तर

14

अपने तर्क का चयन पर: एनोटेशन परम हो रही पर http://forum.springsource.org/archive/index.php/t-61308.html

:

@Before("execution(* *(@CustomAnnotation (*)))") 
public void advice() { 
System.out.println("hello"); 
} 

रेफरी

MethodSignature signature = (MethodSignature) joinPoint.getSignature(); 
Method method = signature.getMethod(); 
Annotation[][] methodAnnotations = method.getParameterAnnotations(); 

आप एनोटेशन जो आप पुनरावृति और instanceof का उपयोग खोजने के लिए कर सकते हैं हो जाएगा आपकी बाध्य एनोटेशन। मुझे पता है कि हैकी लेकिन afaik यह वर्तमान में समर्थित एकमात्र तरीका है।

+2

mathing के लिए दो डॉट्स का उपयोग करना चाहिए आप एनोटेशन यानी बाद में एक रिक्ति जोड़ने की जरूरत है @ कस्टमअनोटेशन (*) –

1
स्प्रिंग डॉक्स से

:

@Before("@annotation(myAnnotation)") 
public void audit(Auditable myAnnotation) { 
    AuditCode code = auditable.value(); 
    // ... 
} 

कौन सा मेरे लिए अच्छी तरह से काम करता है, विधि हस्ताक्षर हेरफेर करने के लिए किसी भी आवश्यकता के बिना।

नोट: यदि आप नामित पॉइंटकट का उपयोग कर रहे हैं, क्योंकि पॉइंटकट नाम ओवरलोड हो सकते हैं, तो आपको मिलान (पैरामीटर नाम और ऑर्डर) हस्ताक्षर की आपूर्ति करनी होगी।

@Before("goodAdvise(myAnnotation)") 
public void audit(Auditable myAnnotation) { 
    String value = auditable.value(); 
    // ... 
} 

@Pointcut("@annotation(myAnnotation)") 
public void goodAdvise(Auditable myAnnotation) { 
    //empty 
} 
+0

'एनोटेशन' पॉइंटकट पैरामीटर पर नहीं, विधि पर एनोटेशन को संदर्भित करता है। –

0

आप विधि में एक से अधिक पैरामीटर है, तो आप भी मानकों के किसी भी संख्या (शून्य या अधिक)

@Before("execution(* *(@CustomAnnotation (*), ..))") 
public void advice() { 
    System.out.println("hello"); 
} 

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

  • कोई संबंधित समस्या नहीं^_^