2012-04-20 10 views
10

Decir que tengo un método de este modo:primavera AOP punto de corte para la discusión anotada

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

¿Hay una expresión punto de corte que podría seleccionar todos los métodos con argumentos con anotada @CustomAnnotation? Si es así, ¿hay alguna manera de obtener acceso, vaya al argumento del "valor"?

Respuesta

14

En la selección de sus argumentos:

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

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

en conseguir el parámetro anotación:

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

le dará el anotaciones que se pueden repetir y utilizar instanceof para encontrar su anotación vinculada Sé que es raro pero afaik, esta es la única forma admitida actualmente.

+2

Es necesario añadir un espacio después de la anotación es decir @ CustomAnnotation (*) –

1

De los Documentos de primavera:

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

que funciona bien para mí, sin ninguna necesidad de manipular la firma del método.

Nota: Si está utilizando un punto de corte con nombre, dado que los nombres de punto pueden estar sobrecargados, debe proporcionar firmas de coincidencia (nombre de parámetro y orden).

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

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

El punto de corte '@ @ 'se refiere a las anotaciones sobre el método, no sobre los parámetros. –

0

Si usted tiene más de un parámetro en el método que debe utilizar también dos puntos de mathing cualquier número de parámetros (cero o más)

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