2010-05-04 3 views
16

나는 경우 방법을 일치하는 포인트 컷과 측면을 만들어야합니다포인트 컷 매칭 방법은

  • 이 공개
  • 그 클래스는 @Controller (마지막으로하지 않습니다)와 주석이
  • @MyParamAnnotation을 사용하여 해당 매개 변수 중 하나 (여러 개 가질 수 있음)에 주석이 추가됩니다.

첫 번째 두 조건은 쉽지만 봄과 세 번째를 수행 할 수 있는지 여부는 알 수 없습니다. 그렇지 않으면, 어쩌면 내가으로 변경할 수 있습니다

매개 변수의
  • 하나는 형 com.me.MyType의 인스턴스 (또는 인터페이스를 구현)

당신이 그것을가 가능하다고 생각하십니까 이걸 달성 할까? 성과가 좋을까요?

감사

EDIT : 매칭 방법의 예. 보시다시피, MyMethod는 주석을 달지 않습니다 (그러나 그렇게 할 수는 있습니다).

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

편집 : 내가 마지막으로 사용 된 솔루션 @Espen 응답에 따라. 보시다시피, 나는 약간의 조건을 변경했습니다. 클래스는 실제로 @Controller 일 필요는 없습니다.

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

답변

19

흥미로운 문제 였으므로 사례를 해결하기 위해 약간의 샘플 응용 프로그램을 만들었습니다! (그리고 나중에 Sinuhe의 피드백을 개선.) 나는 화면에 대한 예로서 작동해야 DemoController 클래스 만든

:

@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) { 
    } 
} 

A는 처음 세 가지 방법에 조인 포인트 추가됩니다 측면을 아닌 파라미터 @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"); 
    } 
} 

첫번째 포인트 컷 @Controller 표시된 클래스 내부의 모든 방법에 joinpoint를를 생성한다.

두 번째 포인트 컷은 다음과 같은 조건이 충족되는 joinpoint를 추가합니다 :

  • 공공 방법
  • *은 모든 반환 형식에 대한 와일드 카드입니다.
  • 두 번째 *은 모든 클래스의 모든 메서드에 대해 와일드 카드입니다.
  • (..,은 주석이 달린 매개 변수 앞에 모든 유형의 매개 변수가 0 개에서 많은 수와 일치합니다.
  • @aspects.MyParamAnnotation (*),은 주어진 주석으로 주석 된 매개 변수와 일치합니다.
  • ..)은 주석이 달린 매개 변수 다음에 오는 모든 유형의 매개 변수와 일치합니다.

마지막으로 @Before 어드바이스는 두 포인트 컷의 모든 조건이 충족되는 모든 방법을 조언합니다.

Pointcut은 AspectJ와 Spring AOP 모두에서 작동한다!

성과에 관해서. 오버 헤드는 작습니다. 특히 AspectJ는 컴파일 타임이나 로딩 타임에 직조를합니다.

+0

좋아 보이지만, 정확히 내가 원하는 것은 아닙니다. 좀 더 정확하기 위해 내 질문을 편집했습니다. 감사. – sinuhepop

+1

나는 그것을 단순화하는 방법을 발견했다. 나는 나의 질문을 편집했지만, 당신에 대한 모든 크레딧을 편집했습니다! 감사. – sinuhepop

+0

좋은 편집! 이런 질문을 하시길 기쁘다;) – sinuhepop