2012-04-20 26 views
10

Nói rằng tôi có một phương pháp như vậy:Spring AOP pointcut cho lập luận chú thích

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

Có một biểu pointcut có thể chọn tất cả các phương pháp với lập luận chú thích với @CustomAnnotation? Nếu vậy thì có cách nào tôi có thể truy cập vào đối số "giá trị" không?

Trả lời

14

On chọn lập luận của bạn:

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

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

On nhận được param chú thích:

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

sẽ giúp bạn có được chú thích mà bạn có thể lặp lại và sử dụng instanceof để tìm chú thích bị ràng buộc của bạn. Tôi biết thats hacky nhưng afaik đây là cách duy nhất được hỗ trợ hiện nay.

+2

Bạn cần phải thêm một không gian sau khi chú thích tức là @ CustomAnnotation (*) –

1

Từ Documents mùa xuân:

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

nào hoạt động tốt đối với tôi, mà không cần phải thao tác các phương pháp chữ ký.

Lưu ý: Nếu bạn đang sử dụng một điểm tên được đặt tên, vì tên điểm cắt có thể bị quá tải, bạn phải cung cấp chữ ký (tên và thứ tự tham số) khớp.

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

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

Phím tắt '@ annotation' đề cập đến các chú thích trên phương thức, chứ không phải trên các tham số. –

0

Nếu bạn có nhiều hơn một tham số trong phương pháp bạn nên sử dụng cũng hai chấm cho mathing bất kỳ số lượng các thông số (zero hoặc nhiều)

@Before("execution(* *(@CustomAnnotation (*), ..))") 
public void advice() { 
    System.out.println("hello"); 
} 
Các vấn đề liên quan