2012-04-20 18 views
10

Sagen, ich habe eine Methode, wie so:Frühling AOP pointcut für kommentierten Argument

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

Gibt es einen pointcut Ausdruck, der alle Methoden mit Argumenten kommentierten mit @CustomAnnotation wählen könnte? Wenn ja, gibt es einen Weg, auf den ich zugreifen könnte, gehe das Argument "Wert"?

Antwort

14

Auf Ihr Argument Auswahl:

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

ref: http://forum.springsource.org/archive/index.php/t-61308.html

Auf die Anmerkung param bekommen:

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

Werden Ihnen die Anmerkungen erhalten, die Sie durchlaufen können und instanceof verwenden zu finden Ihre gebundene Annotation. Ich weiß, das ist Hacky aber afaik das ist die einzige Möglichkeit, die derzeit unterstützt wird.

+2

Sie benötigen einen Platz nach der Anmerkung dh hinzufügen @ CustomAnnotation (*) –

1

aus dem Frühjahr Docs:

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

, die gut funktioniert für mich, ohne dass die Methodensignatur zu manipulieren.

Hinweis: Wenn Sie einen benannten Pointcut verwenden, weil die Pointcut-Namen überlastet sein können, müssen Sie übereinstimmende (Parametername und Reihenfolge) Signaturen angeben.

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

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

Der "@ Annotation" -Punktcut bezieht sich auf die Anmerkungen zur Methode, nicht auf die Parameter. –

0

Wenn Sie mehr als einen Parameter in der Methode haben, sollten Sie auch zwei Punkte verwenden, um eine beliebige Anzahl von Parametern mathing (null oder mehr)

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