2013년 7월 27일 토요일

[오라클자바개발자실무교육,오엔제이프로그래밍실무교육센터,spring framework3.X강좌]Spring AOP DynamicMethodMatcherPointcut

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;
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

댓글 없음:

댓글 쓰기