6. Join Points and Pointcuts
참조 : http://www.eclipse.org/aspectj/doc/released/progguide/quick.html
Advice의 종류는 이전에 살펴 보았고 Join Point들은 위 링크에서 볼 수 있습니다. 위 링크에서 볼 수 있는 Join Point들은 AspectJ에서 지원 해주는 것들이고 Spring에서는 저 중에서 Method execution만 지원합니다. 이 내용은 Spring Reference 6.2.3.1 에서 확인 할 수 있습니다.
AspectJ In Action 2.4.2 에 나와있는 예제 소스 중에 실행 하는 소스의 모든 Join Point들에 before advice와 after advice를 적용할 수 있는 aspect 소스가 있습니다. 소스는 다음과 같습니다.
public aspect JoinPointTraceAspect {
private int _callDepth = -1;
pointcut tracePoints() : !within(JoinPointTraceAspect);
before() : tracePoints() {
_callDepth++;
print("Before", thisJoinPoint);
}
after() : tracePoints() {
print("After", thisJoinPoint);
_callDepth--;
}
private void print(String prefix, Object message) {
for (int i = 0, spaces = _callDepth * 2; i < spaces; i++) {
System.out.print(" ");
}
System.out.println(prefix + ": " + message);
}
}
pointcut tracePoints() 는 Pintcut의 이름을 정의한 부분이고
!within(JointPointTraceAspect)는 JoinPointTraceAspect 클래스 이외의 모든 Joint Point들을 Pointcut으로 묶었습니다.
위 소스코드를 이 전에 실행 시켜 보았던 AspectJ를 사용한 초간단 AOP 예제에 같이 두고 돌려보면 콘솔창에 다음과 같이 여러 Join Point를 볼 수 있습니다.
[#M_ more.. | less.. |
Before: staticinitialization(firstAOP.Keesun.<clinit>)
After: staticinitialization(firstAOP.Keesun.<clinit>)
Before: execution(void firstAOP.Keesun.main(String[]))
Before: call(firstAOP.Keesun())
Before: preinitialization(firstAOP.Keesun())
After: preinitialization(firstAOP.Keesun())
Before: initialization(firstAOP.Keesun())
Before: execution(firstAOP.Keesun())
After: execution(firstAOP.Keesun())
After: initialization(firstAOP.Keesun())
After: call(firstAOP.Keesun())
Before: call(void firstAOP.Keesun.say())
Before: staticinitialization(firstAOP.Manner.<clinit>)
Before: preinitialization(firstAOP.Manner())
After: preinitialization(firstAOP.Manner())
Before: initialization(firstAOP.Manner())
Before: execution(firstAOP.Manner())
After: execution(firstAOP.Manner())
After: initialization(firstAOP.Manner())
After: staticinitialization(firstAOP.Manner.<clinit>)
Before: adviceexecution(void firstAOP.Manner.before())
Before: get(PrintStream java.lang.System.out)
After: get(PrintStream java.lang.System.out)
Before: call(void java.io.PrintStream.println(String))
Welecome
After: call(void java.io.PrintStream.println(String))
After: adviceexecution(void firstAOP.Manner.before())
Before: execution(void firstAOP.Keesun.say())
Before: get(PrintStream java.lang.System.out)
After: get(PrintStream java.lang.System.out)
Before: call(void java.io.PrintStream.println(String))
keesun
After: call(void java.io.PrintStream.println(String))
After: execution(void firstAOP.Keesun.say())
Before: adviceexecution(void firstAOP.Manner.after())
Before: get(PrintStream java.lang.System.out)
After: get(PrintStream java.lang.System.out)
Before: call(void java.io.PrintStream.println(String))
Good bye
After: call(void java.io.PrintStream.println(String))
After: adviceexecution(void firstAOP.Manner.after())
After: call(void firstAOP.Keesun.say())
After: execution(void firstAOP.Keesun.main(String[]))
_M#]