오라클자바커뮤니티에서 설립한
오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝,
힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)
자세한 내용은 Pointcut 강좌를 참고하세요.
아래예제는 First.java의 one 메소드에만 충고(Advice)가 적용되는 예제 입니다.
[First.java]
package onj.edu.aop1;
package onj.edu.aop1;
public class First {
public void one() {
System.out.println("First One...");
}
public void two() {
System.out.println("First Two...");
}
}
public void one() {
System.out.println("First One...");
}
public void two() {
System.out.println("First Two...");
}
}
[Second.java]
package onj.edu.aop1;
package onj.edu.aop1;
public class Second {
public void one() {
System.out.println("Second One...");
}
public void two() {
System.out.println("Second Two...");
}
}
public void one() {
System.out.println("Second One...");
}
public void two() {
System.out.println("Second Two...");
}
}
[SimpleAdvice.java]
package onj.edu.aop1;
package onj.edu.aop1;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.aopalliance.intercept.MethodInvocation;
public class SimpleAdvice implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println(invocation.getMethod().getName());
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println(invocation.getMethod().getName());
Object o = invocation.proceed();
System.out.println("... SimpleAdvice의 충고가 적용됨 ...");
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;
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);
}
};
}
}
//아래는 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;
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);
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();
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();
proxyFirst.two();
proxySecond.one();
proxySecond.two();
}
}
proxySecond.two();
}
}
[결과]
one
First One...
... SimpleAdvice의 충고가 적용됨 ...
First Two...
Second One...
Second Two...
댓글 없음:
댓글 쓰기