Whiteship's Note

Spring AOP(old) Pointcut

AOP : 2007.03.28 08:42


참조 : Reference 7.2, Spring In Action

Concept 
advice가 어떤 타입이든 상관없이 같은 포인트컷에 여러 adivce를 적용할 수 있습니다.
public interface Pointcut {
    ClassFilter getClassFilter();
    MethodMatcher getMethodMatcher();
}

핵심이 되는 포인트컷 인터페이스로 클래스와 메소드로 포인트컷을 판단하게 되기 때문에 저렇게 나뉘어져 있습니다. 클래스 필터와 메소드 필터의 재사용성을 고려한거라고 볼 수 있습니다.
public interface ClassFilter {
    boolean matches(Class clazz);
}

인자로 받은 클래스 타입에 따라 true, false를 리턴하면 되겠죠. 이 것 보다는 훨씬 복잡하고 중요한 것이 메소드 필터 입니다.
public interface MethodMatcher {
    boolean matches(Method m, Class targetClass);
    boolean isRuntime();
    boolean matches(Method m, Class targetClass, Object[] args);
}

왜 클래스 필터가 있는데 클래스를 인자로 받을까요? - 모르겠네..흠...

위에서 부터 차례대로 프록시 객체를 생성할 때 호출이 되며 먼저 matches(Method, Class)를 호출해서 ture면 isRuntime()이 호출 되는 때 이 때 정적 포인트컷이면 false를 리턴하고 동적 포인트컷이면 true를 리턴합니다. isRuntime이 false면 세번째 메소드는 호출하지 않고 true면 매번 advice가 적용될 때 마다 호출 하여 확인하게 됩니다.
정적 포인트컷 : matches(Method, Class)로 딱 한번 실행 됩니다.
동적 포인트컷 : matches(Method, Class, Object[])는 매번 adivce가 적용 될 때 마다 실행 되서 체크하게 됩니다.

동적 포인트컷을 확인할 때 인자를 받는 이유는? - 메소드 이름과 클래스 이름이나 타입만 가지고는 확인하는데 필요한 정보가 부족한가. 왜 그걸론 부족하지? - 메소드와 클래스 정보로 부족하다면 정적 포인트컷은 왜 인자를 받아 오지 않는거지..

포인트컷 연산
- union :: 합집합
- intersaction :: 교집합
Pointcuts 클래스에 있는 메소드를 사용합니다. 하지만 2.0에 추가된 AspectJ의 표현식을 사용하면 더 간단하죠. || 나 && 이런 걸로 해결이 가능하니까요.
top




: 1 : ··· : 18 : 19 : 20 : 21 : 22 : 23 : 24 : 25 : 26 : ··· : 40 :