2013년 7월 27일 토요일

[오라클자바개발자실무교육,오엔제이프로그래밍실무교육센터, Spring Framework3.X ]Spring AOP 애노테이션을 활용한 포인트 컷

Spring AOP 애노테이션을 활용한 포인트

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


Application이 애노테이션 기반이라면 커스텀 애노테이션을 사용해서 포인트컷을 지정하고 어드바이스를 특정 애노테이션이 적용된 모든 메소드 또는 타입에 적용하고 싶을 때가 있다. 스프링은 애노테이션을 사용해서 포인트컷을 정의할 수 있도록 해주는 AnnotationMatchingPointcut 클래스를 제공한다.
[AdviceRequired.java]
package onj.edu.aop6;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})  // 애노테이션을 타입레벨과 메소드레벨에서 적용할수있도록
public @interface AdviceRequired {  //interface 애노테이션으로 선언
}
[First.java]
package onj.edu.aop6;
public class First {
       @AdviceRequired  //어드바이스가 적용될
       public void hello() {
             System.out.println("hello1 ... ");
       }
      
       public void sayHello() {
             System.out.println("sayHello ... ");
       }     
}
[SimpleAdvice.java]
package onj.edu.aop6;
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;
           }
}
[AnnotationPointcutExam.java]
package onj.edu.aop6;
import org.springframework.aop.Advisor;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.annotation.AnnotationMatchingPointcut;
public class AnnotationPointcutExam {
       public static void main(String[] args) {
             First target = new First();
            
             //Advisor, 메소드를 호출하면서 지정한 애노테이션이 적용된 모든 메소드에 어드바이스를 적용
             AnnotationMatchingPointcut pc = AnnotationMatchingPointcut.forMethodAnnotation(AdviceRequired.class);
             Advisor advisor = new DefaultPointcutAdvisor(pc, new SimpleAdvice());
            
             //Proxy
             ProxyFactory pf = new ProxyFactory();
             pf.setTarget(target);
             pf.addAdvisor(advisor);
             First f = (First)pf.getProxy();
            
             f.hello();
             f.sayHello();      
       }
}
[결과]
hello
hello1 ...
... SimpleAdvice 충고가 적용됨 ...
sayHello ...

댓글 없음:

댓글 쓰기