2013년 7월 27일 토요일

[오라클자바개발자실무교육,오엔제이프로그래밍실무교육센터,Spring Framework3.2강좌]Spring AOP(StaticMethodMatcherPointcut )

StaticMethodMatcherPointcut을 상속할 때는 matches 메소드만 구현하면 되지만 올바른 타입의 메소드만 어드바이스가 적용되도록 할려면 getClassFilter() 메소드를 오버라이드 하는 것이 좋다.

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷  실무전문 강의)



자세한 내용은 Pointcut 강좌를 참고하세요.
아래예제는 First.java의 one 메소드에만 충고(Advice)가 적용되는 예제 입니다.
[First.java]
package onj.edu.aop1;
public class First {
 public void one() {
  System.out.println("First One...");
 }
 public void two() {
  System.out.println("First Two...");
 }
}
[Second.java]
package onj.edu.aop1;
public class Second {
 public void one() {
  System.out.println("Second One...");
 }
 public void two() {
  System.out.println("Second Two...");
 }
}
[SimpleAdvice.java]
package onj.edu.aop1;
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;
   }
}
[SimpleStaticPointcut.java]
package onj.edu.aop1;
import java.lang.reflect.Method;
import org.springframework.aop.ClassFilter;
import org.springframework.aop.support.StaticMethodMatcherPointcut;
public class SimpleStaticPointcut extends StaticMethodMatcherPointcut {
   //아래는 First.class의 one()메소드일때 충고가 적용된다.
   public boolean matches (Method method, Class<?> cls) {
      return ("one".equals(method.getName()));
   }
   public ClassFilter getClassFilter() {
       return new ClassFilter() {
   public boolean matches(Class<?> cls) {
            return (cls == First.class);
         }
      };
   }
}


[StaticPointcutExam.java]
public class StaticPointcutExam {
public static void main(String[] args) {
First f = new First();
Second s = new Second();
First proxyFirst;
Second proxySecond;
//pointcut, advice, advisor 생성
Pointcut pc = new SimpleStaticPointcut();
Advice advice = new SimpleAdvice();
Advisor advisor = new DefaultPointcutAdvisor(pc, advice);
//First 프록시 생성
ProxyFactory pf = new ProxyFactory();
pf.addAdvisor(advisor);
pf.setTarget(f);  //First.class를 타겟으로
proxyFirst = (First)pf.getProxy();

//First 프록시 생성
pf = new ProxyFactory();
pf.addAdvisor(advisor);
pf.setTarget(s);  //Second.class를 타겟으로
proxySecond = (Second)pf.getProxy();
proxyFirst.one();
proxyFirst.two();
proxySecond.one();
proxySecond.two();
}
}

[결과]
one
First One...
... SimpleAdvice의 충고가 적용됨 ...
First Two...
Second One...
Second Two...

 

댓글 없음:

댓글 쓰기