Whiteship's Note


기선 씨네마 :: Pointcut

AOP : 2007. 3. 30. 14:01


영화관에서 표를 팔 때(sellTicket)만 welcome과 thankyou Advice를 적용하려면 이전에 살펴봤던 NameMathMethodPointcut이나 NameMathMethodPointcutAdvisor를 이용하면 됩니다.

사용자 삽입 이미지
이렇게 Advisor를 만들면서 pointcut을 정의해줘도 되고, Pointcut만 따로 만든 다음에 DefaultPointcutAdvisor로 합쳐도 됩니다.

사용자 삽입 이미지
이번에는 포인트 컷을 따로 만들고 DefaultPointcutAdvisor를 사용해서 advice와 pointcut을 묶고 그것을 ProxyFactoryBean에 주입시켰습니다.

둘 다 결과는 원하던데로 sellTicket() 메소드에만 welcome, thank Advice가 적용됩니다.


'AOP' 카테고리의 다른 글

AOP Design 이슈  (0) 2007.09.07
AspectJ In Action 3장  (0) 2007.08.22
BeanNameAutoProxyCreator 사용 예  (0) 2007.04.01
Autoproxy  (0) 2007.04.01
Spring AOP(old) ProxyFactoryBean 불편한 점  (0) 2007.03.30
기선 씨네마 :: Pointcut  (0) 2007.03.30
기선 씨네마 :: Advice  (0) 2007.03.30
기선 씨네마 :: 티켓 만들어 주기  (0) 2007.03.30
Spring AOP 공부를 위한 예제 - 기선 씨네마  (0) 2007.03.30
Spring AOP(old) Pointcut Implementation  (0) 2007.03.28
Spring AOP(old) Advisor  (0) 2007.03.28
top

Write a comment.


Spring AOP(old) Pointcut

AOP : 2007. 3. 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

Write a comment.


9. @AspectJ의 Pointcut 살펴보기 2

AOP : 2007. 1. 16. 17:36


참조 : http://www.eclipse.org/aspectj/doc/released/progguide/semantics-pointcuts.html

this(Type)
  • this 키워드에 바인딩 되는 현재 실행 중인 객체의 타입이 Type인 경우에 모든 메소드 execution Join point를 나타냅니다.
target(Type)
  • 메소드가 호출되거나 필드가 접근 되는 객체의 타입이 Type인 경우에 그 객체의 모든 메소드 execution Join point를 나타냅니다.
args( Type or ".." or * )
  • 메소드의 아규먼트가 () 안에 정의한 갯수나 타입에 매칭 되는 모든 메소드 exexution Join point를 나타냅니다.
@targer(Type)
  • 타켓 객체(메소드가 호출되거나 필드가 접근 되는 객체)에 @Type 어노테이션이 붙어있을 때 그 객체의 모든 메소드 execution Join point를 나타냅니다.
@within(Type)
  • 선언된 타입에 @Type 어노테이션이 붙어있을 때 그 객체의 모든 execution Join point를 나타냅니다.
@annotation(Type)
  • 실행되는 메소드에 @Type 어노테이션이 붙어있을 때 그 메소드의 execution Join point를 나타냅니다.
@args(Type)
  • 실행시 아규먼트로 넘겨지는 것에 @Type 어노테이션이 붙어있을 때 그 메소드의 execution Join point를 나타냅니다.
top

Write a comment.


8. @AspectJ의 Pointcut 살펴보기 1

AOP : 2007. 1. 16. 12:47


참조 : Spring Reference 6.2.3.4

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
  • 빨간색으로 표시된 return type pattern을 제외 하고는 전부 optional입니다.
  • modifiers-pattern은 advice가 적용될 메소드의 접근 지시자 형태를 정합니다. * 은 모든 메소드 public은 public 메소드만... 뭐 그런 식입니다.
  • declaring-type-pattern은 인터페이스나 패키지 패턴을 나타내는 부분인듯 합니다.
  • name-pattern은 메소드의 이름의 형태를 지정해 줍니다. set* 과 같이 하면 set으로 시작하는 모든 메소드를 나타냅니다.
  • param-pattern은 조금 특이합니다. ()은 파라미터가 없는 메소드를 가리키고, (..)는 파라미터가 어떤 형태든 몇 개든 상관없슴을 나타냅니다. 다른 패턴들이 * 와일드 카드를 사용하는 것과는 차이가 있네요. (*, String) 이것은 파라미터가 두 개고 첫번 째 파라미터의 타입은 상관이 없고 두 번째 파라미터의 타입이 String인 메소드를 나타냅니다.
within(type-pattern)
  • within은 Spring AOP가 메소드 execution 포인트컷만 지원하기 때문에 해당 타입과 관련된 모든 메소드 실행시점을 가리키게 됩니다. AspectJ를 사용할 때는 훨씬 다양한 포인트컷[각주:1]을 나타내게 됩니다.
  • within(com.xyz.service.*) 이것 같은 경우는 com.xyz.service 패키지 안에 있는 모든 클래스의 모든 메소드의 실행 시점을 나타냅니다.
  1. 클래스 초기화 시점, 객체 초기화 시점, 생성자 실행 시점, 메소드 실행 시점 이밖에도 변수들에 대한 포인트컷까지 적용되며 내부 클래스가 있을 경우 그 것의 생성자나 기타 내부 클래스와 관련된 모든 join point에도 적용 됩니다. [본문으로]
top

Write a comment.