2010-05-04 33 views
16

tôi cần phải tạo ra một khía cạnh với một pointcut phù hợp với một phương pháp nếu:pointcut phương pháp phù hợp với các thông số chú thích

  • là công
  • lớp của nó được chú thích với @Controller (Cuối cùng không)
  • Một trong các tham số của nó (có thể có nhiều tham số) được chú thích bằng @MyParamAnnotation.

Tôi nghĩ rằng hai điều kiện đầu tiên rất dễ dàng, nhưng tôi không biết liệu có thể thực hiện được điều kiện thứ ba với Spring hay không. Nếu nó không phải là, có lẽ tôi có thể thay đổi nó thành:

  • Một trong những thông số của nó là một thể hiện của loại com.me.MyType (hoặc thực hiện một số giao diện)

Bạn có nghĩ rằng nó có thể đạt được điều này? Và hiệu suất sẽ tốt?

Cảm ơn

EDIT: Một ví dụ về một phương pháp phù hợp. Như bạn có thể thấy, MyMethod không được chú thích (nhưng nó có thể là).

@Controller 
public class MyClass { 
    public void MyMethod (String arg0, @MyParamAnnotation Object arg1, Long arg3) { 
     ... 
    } 
} 

EDIT: Giải pháp cuối cùng tôi đã được sử dụng, dựa trên câu trả lời @Espen. Như bạn có thể thấy, tôi đã thay đổi các điều kiện của mình một chút: lớp không thực sự cần phải là một @Controller.

@Around("execution(public * * (.., @SessionInject (*), ..))") 
public void methodAround(JoinPoint joinPoint) throws Exception { 
    ... 
} 

Trả lời

19

Đó là một vấn đề thú vị, vì vậy tôi đã tạo một ứng dụng mẫu nhỏ để giải quyết vụ án! (Và cải thiện nó với thông tin phản hồi Sinuhe của sau đó.)

Tôi đã tạo ra một lớp DemoController nên hoạt động như một ví dụ cho các khía cạnh:

@Controller 
public class DemoController { 

    public void soSomething(String s, @MyParamAnnotation Double d, Integer i) { 
    } 

    public void doSomething(String s, long l, @MyParamAnnotation int i) { 
    } 

    public void doSomething(@MyParamAnnotation String s) { 
    } 

    public void doSomething(long l) { 
    } 
} 

Khía cạnh mà sẽ thêm một điểm tham gia trên ba phương pháp đầu tiên , nhưng không phải là phương pháp cuối cùng mà các tham số không được chú thích với @MyParamAnnotation:

@Aspect 
public class ParameterAspect { 

    @Pointcut("within(@org.springframework.stereotype.Controller *)") 
    public void beanAnnotatedWithAtController() { 
    } 

    @Pointcut("execution(public * *(.., @aspects.MyParamAnnotation (*), ..))") 
    public void methodWithAnnotationOnAtLeastOneParameter() { 
    } 

    @Before("beanAnnotatedWithAtController() " 
      + "&& methodWithAnnotationOnAtLeastOneParameter()") 
    public void beforeMethod() {  
     System.out.println("At least one of the parameters are " 
        + "annotated with @MyParamAnnotation"); 
    } 
} 

các pointcut đầu tiên sẽ tạo ra một joinpoint trên tất cả các phương pháp bên trong các lớp học được đánh dấu bằng @Controller.

Các pointcut thứ hai sẽ thêm một joinpoint khi các điều kiện sau đây được đáp ứng:

  • phương pháp nào
  • đầu tiên * là một ký tự đại diện cho tất cả các kiểu trả về.
  • giây * là ký tự đại diện cho tất cả các phương pháp trong tất cả các lớp.
  • (.., khớp 0 với nhiều tham số thuộc bất kỳ loại nào trước thông số được chú thích.
  • @aspects.MyParamAnnotation (*), khớp với thông số được chú thích với chú thích đã cho.
  • ..) khớp 0 với nhiều tham số thuộc bất kỳ loại nào sau thông số được chú thích.

Cuối cùng, lời khuyên @Before tư vấn cho tất cả các phương pháp mà tất cả các điều kiện trong cả hai phím tắt đều được thỏa mãn.

Phím tắt hoạt động với cả AspectJ và Spring AOP!

Khi nói đến hiệu suất. Các chi phí nhỏ, đặc biệt là với AspectJ mà không dệt trên thời gian biên dịch hoặc thời gian tải.

+0

Có vẻ tốt, nhưng nó không chính xác những gì tôi đang tìm kiếm. Tôi đã chỉnh sửa câu hỏi của mình để chính xác hơn. Cảm ơn. – sinuhepop

+1

Tôi đã tìm thấy một phương pháp để đơn giản hóa nó. Tôi đã chỉnh sửa câu hỏi của tôi, nhưng tất cả các khoản tín dụng về bạn! Cảm ơn. – sinuhepop

+0

Chỉnh sửa tốt! Vui mừng khi thấy bạn thích loại câu hỏi này;) – sinuhepop

Các vấn đề liên quan