@AspectJ의 Pointcut 살펴보기 1
@AspectJ의 Pointcut 살펴보기 2

이전 글에서 정리를 했지만 좀 더 간단하게 정리 하겠습니다. pointcut 종류에 따라 표현식이 조금씩 다르지만 크게 세분류로 나눌 수 있습니다.

  • execution(method signature), call(method signature)
  • target(type signature), this(type signature), agrs(type signature)
  • @target(annotation name), @args(annotation name), @within(annotation name), @annotation(annotation name)

1. method signature는 다음과 같습니다.

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)

         throws-pattern?)

접근지시자 패턴(modifiers-pattern)은 생략 가능합니다.

retyrn type 패턴은 * 을 사용하여 모든 리턴타입을 나타낼 수 있습니다.

타입 패턴(declaring-type-pattern)역시 생략 가능합니다.

메소드 이름 패턴(name-pattern)은 타입패턴과 붙여서 사용 합니다.

execution( aop.newStyle.domain.Ticket *.sell*(..))

=> 어떤 접근지시자든 상관없고 Ticket을 리턴하는 sell로 시작하는 메소드

execution(public aop.newStyle.domain.Ticket *.sell*(..))

=> public 접근지시자를 가지고 있고 Ticket을 리턴하고 sell로 시작하는 메소드


그럼 default 접근지시자는 어떻게 표현하지? - 접근지시자를 생략하면 모든 접근지시자로 인식하고 써주면 해당 접근지자면.. default라고 써주면 에러가 납니다. 흠.. 어떻게 하지..;;

execution(* set*(..))

=> 접근지시자와 리턴타입은 상관없고 set으로 시작하는 모든 메소드

2. type signature는 method signature에서dml type pattern과 같습니다.

AspectJ에서 this와 target은 같은 객체를 나타내지만 Spring AOP에서는 프록시를 사용하고 있기 때문에
this는 프록시 객체를 나타내고 target은 프록시 객체가 감싸는 객체를 나타냅니다. 즉 다른 객체 입니다.

3. annotaion name은 제일 상단 링크 중 두번째 것을 참조하시면 알 수 있습니다.

현재까지는 위에 적혀있는 designator들만 지원이 되며 차후에 AspectJ에 있는 다른 designator들(call,
initialization, preinitialization, staticinitialization, get, set,
handler, adviceexecution, withincode, cflow, cflowbelow, if, @this,
@withincode)도 추가될 예정입니다.