sitelink1 | https://blog.naver.com/archy712/38646519 |
---|---|
sitelink2 | |
sitelink3 | |
extra_vars6 |
Pointcut (교차점)
- AOP에서 Advice(충고)가 적용될 대상 객체의 적용 지점(포인트)을 정의
- 재사용이 가능하여 동일한 pointcut을 사용하여 다른 advice(총고)를 설정할 수 있다.
- 다음의 Pointcut interface를 구현해서 advice를 적용할 수 있다.
- 클래스와 매치되는 부분과 메소드의 matcher를 이용하여 union(병합) 수행을 허용
public interface Pointcut { ClassFilter getClassFilter(); MethodMatcher getMethodMatcher(); } |
ClassFilter 인터페이스
- 주어진 target 클래스들의 셋트에 pointcut(교차점)을 제한하기 위함
- matches() 메소드가 항상 true를 반환한다면 모든 target 클래스들을 매치
public interface ClassFilter { boolean matches(Class clazz); } |
MethodMatcher 인터페이스
- pointcut(교차점)이 target 클래스상에서 주어진 메소드를 매치하여 포함할 것인지 검사
- 모든 메소드 호출에 대하여 검사의 요구를 피하기 위해서 AOP 프록시를 생성할 때 이 검사를 수행
- 대부분의 Methodmatcher 들은 정적(static), isRuntime() 메소드는 false를 반환함을 의미
=> 이 경우에 3개의 인자를 가진 matches 메소드를 결코 호출하지 않는다
- 가능하다면, AOP 프록시가 생성되었을 때 AOP 프레임워크가 pointcut 평가의 결과를 캐시하도록 하기 위해
=> pointcut을 정적(static)으로 만드는게 좋다
public interface MethodMatcher { boolean matches(Method m, Class targetClass); boolean isRuntime(); boolean matches(Method m, Class targetClass, Object[] args); } |
Pointcut에서의 기능
- 조합(Union)
=> pointcut이 일치하는 어떠한 일치되는 메소드가 하나라도 있는지를 의미한다.(either)
- 교차(Intersection)
=> 두 개의 pointcut이 서로 일치하는 메소드를 의미.(both)
- org.springframework.aop.support.PointCuts 클래스내 정적 메소드나 같은 패키지내 ComposablePointcut 클래스를 사용하여 이루어 질 수 있다.
- AspjectJ pointcut 표현을 사용하는 것이 좀 더 단순한 방법이다.
AspectJ 표현 pointcuts
- 2.0 이후에 Spring에 의해 사용되는 pointcut의 가장 중요한 타입은 AspectJExpressionPointcut
- AspectJ pointcut 표현 문자열을 파싱하기 위한 AspectJ 제공 라이브러리를 사용하는 pointcut
편리한 pointcut 인터페이스 구현체들
1) 정적(Static) Pointcuts
1-1) Regular expression pointcuts(정규 표현식 pointcuts)
- Perl5RegexpMethodPointcut
=> Perl5 정규표현식 문법을 사용하는 일반적인 정규표현식 pointcut
=> 정규표현식을 일치시키기 위한 Jakarta ORO에 의존
예제)
- JdkRegexpMethodPointcut
=> JDK 1.4 이상에서 지원되는 정규 표현식을 사용
- RegexpMethodPointcutAdvisor 클래스
=> 특정 advice(인터셉터, before advice, throws advice)의 참조로 하여 사용할 수 있는 advisor
=> 내부적으로 메소드의 패턴을 명시하여 pointcut 기능을 구현
예제)
1-2) Attribute-driven(속성지향) pointcut
=> 메타데이터-지향 pointcut
=> 소스-레벨의 메타데이터인 메타데이터 속성의 값을 사용
2) 동적(Dynamic) pointcuts
=> 정적인(static) pointcut보다 평가하는데 좀 더 가치가 있다.
=> 정적인(sttaic) 정보만큼 메소드 인자를 고려. (모든 메소드 호출시 평가되어야만 한다)
=> 결과는 인자가 다양한 만큼 캐시될 수 없다.
2-1) 제어 흐름(Control flow) pointcuts
- 다소 덜 강력하지만 개념적으로 AspectJ cflow pointcuts와 유사
- 다른 동적인 pointcut보다 런타임시 평가하는 것이 명백히 비용이 비싸다.(Java 1.4에서 다른 동적인 pointcut의 약 5배)
Pointcut 슈퍼 클래스
- 자체적인 pointcut을 구현하기 위해 제공
- 정적인 pointcut이 가장 유용하기 때문에 대부분 StaticMethodMatcherPointcut의 하위 클래스를 이용
- 하나의 추상 메소드를 구현하는 것을 요구
class TestStaticPointcut extends StaticMethodMatcherPointcut { public boolean matches(Method m, Class targetClass) { // return true if custom criteria match } } |