참조 : 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#]