Spring AOP DynamicMethodMatcherPointcut
DynamicMethodMatcherPointcut에서 충고가 적용되는 메소드는 모든 메소드를 검사하는 초기화 단계, 메소드가 처음 호출되는 시점에 걸쳐 두 번의 정적 검사를 받게 된다. 이 처럼 동적 포인트 컷은 정적 포인트 컷 보다 유연하게 적용될 수 있지만 성능 부담을 고려해 필요한 경우만 사용해야 한다.
:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
아래예제는 First.java의 one 메소드에만 충고(Advice)가 적용되는 예제 입니다.
[First.java]package onj.edu.aop2;
public class First {
public void one(int i) {
System.out.println("First One... i = " + i);
}
public void two() {
System.out.println("First Two...");
}
}
}
[SimpleAdvice.java]
package onj.edu.aop2;
package onj.edu.aop2;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class SimpleAdvice implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println(invocation.getMethod().getName());
Object o = invocation.proceed();
System.out.println("... SimpleAdvice의 충고가 적용됨 ...");
return o;
}
}
[SimpleDynamicPointcut.java]package onj.edu.aop2;
import java.lang.reflect.Method;
import org.springframework.aop.ClassFilter;
import org.springframework.aop.support.DynamicMethodMatcherPointcut;
/* DynamicMethodMatcherPointcut은
* matches(Method method, Class<?> cls, Object[] args) 반드시 구현해야함
* 정적체크를 위해서는 matches(Method method, Class<?> cls)도 같이 구현해야 한다.
*/
public class SimpleDynamicPointcut extends DynamicMethodMatcherPointcut {
//메소드 이름이 one 인 경우 true 즉 충고가 주입된다.아래는 정적체크
//스프린은 two 메소드에 대해서는 동적 검사를 진행안함
public boolean matches(Method method, Class<?> cls) {
System.out.println("static check :: method.getName() :: " + method.getName());
return "one".equals(method.getName());
}
//아래 메소드는 동적검사
public boolean matches(Method method, Class<?> cls, Object[] args) {
System.out.println("dynamic Check :: " + ((Integer)args[0]).intValue());
int i = ((Integer)args[0]).intValue();
return i > 100;
}
// First.class만 충고가 주입된다.
public ClassFilter getClassFilter() {
return new ClassFilter() {
public boolean matches(Class <?> cls) {
return (cls == First.class);
}
};
}
}
[DynamicPointcutExam.java]
package onj.edu.aop2;
import org.springframework.aop.Advisor;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;
public class DynamicPointcutExam {
public static void main(String[] args) {
First target = new First();
//어드바이저 생성
Advisor advisor = new DefaultPointcutAdvisor(new SimpleDynamicPointcut(), new SimpleAdvice());
ProxyFactory pf = new ProxyFactory();
pf.setTarget(target);
pf.addAdvisor(advisor);
First proxy = (First)pf.getProxy();
proxy.one(99);
proxy.one(101);
proxy.two();
}
}
[결과]static check :: method.getName() :: one
static check :: method.getName() :: two
static check :: method.getName() :: clone
static check :: method.getName() :: toString
static check :: method.getName() :: one
dynamic Check :: 99
First One... i = 99
dynamic Check :: 101
one
First One... i = 101
... SimpleAdvice의 충고가 적용됨 ...
static check :: method.getName() :: two
댓글 없음:
댓글 쓰기