SSISO Community

시소당

[AOP]StaticMethodMatcherPointcut을 사용한 Static Pointcut 예제

StaticMethodMatcherPointcut을 사용한 Static Pointcut 예제
package com.youngkun.aoptest.pointcut;

public class BeanOne {
   public void foo(){
       System.out.println("foo");
   }
   public void bar(){
       System.out.println("bar");
   }
}


package com.youngkun.aoptest.pointcut;

public class BeanTwo {

   public void foo(){
       System.out.println("foo");
   }
   public void bar(){
       System.out.println("bar");
   }

}


package com.youngkun.aoptest.pointcut;

import java.lang.reflect.Method;

import org.springframework.aop.ClassFilter;
import org.springframework.aop.support.StaticMethodMatcherPointcut;

public class SimpleStaticPointcut extends StaticMethodMatcherPointcut {

   //foo()메소드와 일치
   public boolean matches(Method method, Class cls) {
       return ("foo".equals(method.getName()));
   }
  
   //BeanOne 클래스와 일치
   public ClassFilter getClassFilter(){
       return new ClassFilter(){
           public boolean matches(Class cls){
               return(cls == BeanOne.class);
           }
       };
   }
}


package com.youngkun.aoptest.pointcut;

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(">> Invoking " + invocation.getMethod().getName());
       Object retVal = invocation.proceed();
       System.out.println(">> Done");
       return retVal;
  
; }
}

package com.youngkun.aoptest.pointcut;

import org.aopalliance.aop.Advice;
import org.springframework.aop.Advisor;
import org.springframework.aop.Pointcut;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;

public class StaticPointcutExample {

   public static void main(String[] args) {
       BeanOne one = new BeanOne();
       BeanTwo two = new BeanTwo();
      
       BeanOne proxyOne;
       BeanTwo proxyTwo;
      
       //pointcut, advice, advisor 생성
       Pointcut pc = new SimpleStaticPointcut();
       Advice advice = new SimpleAdvice();
       Advisor advisor = new DefaultPointcutAdvisor(pc, advice);
      
       //BeanOne proxy 생성
       ProxyFactory pf = new ProxyFactory();
       pf.addAdvisor(advisor);
       pf.setTarget(one);
       proxyOne = (BeanOne)pf.getProxy();
      
       //BeanTwo proxy 생성
       pf = new ProxyFactory();
       pf.addAdvisor(advisor);
       pf.setTarget(two);
       proxyTwo = (BeanTwo)pf.getProxy();
      
       proxyOne.foo();
       proxyTwo.foo();
      
       proxyOne.bar();
       proxyTwo.bar();
   }

}


실행결과
붉은색 클래스와 메소드가 일치해서 advice 적용
파란색 클래스와 메소드가 일치하지 않아서 advice가 적용이 안됨
>> Invoking foo
foo
>> Done
foo
bar
bar

896 view

4.0 stars