Java/Spring/MethodInterceptor

Материал из Java эксперт
Перейти к: навигация, поиск

Check InvokedMethod In MethodInterceptor

   <source lang="java">
      

File: Main.java import java.lang.reflect.Method; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.Advisor; import org.springframework.aop.ClassFilter; import org.springframework.aop.framework.ProxyFactory; import org.springframework.aop.support.DefaultPointcutAdvisor; import org.springframework.aop.support.DynamicMethodMatcherPointcut; public class Main {

 public static void main(String[] args) {
   MyClass target = new MyClass();
   Advisor advisor = new DefaultPointcutAdvisor(new SimpleDynamicPointcut(), new SimpleAdvice());
   ProxyFactory pf = new ProxyFactory();
   pf.setTarget(target);
   pf.addAdvisor(advisor);
   MyClass proxy = (MyClass) pf.getProxy();
   proxy.foo(1);
   proxy.bar();
 }

} class MyClass {

 public void foo(int x) {
   System.out.println("MyClass.foo() : " + x);
 }
 public void bar() {
   System.out.println("MyClass.bar()");
 }

} class SimpleAdvice implements MethodInterceptor {

 public Object invoke(MethodInvocation invocation) throws Throwable {
   System.out.println("SimpleAdivce.Invoking " + invocation.getMethod().getName());
   Object retVal = invocation.proceed();
   System.out.println("SimpleAdvice.Done");
   return retVal;
 }

} class SimpleDynamicPointcut extends DynamicMethodMatcherPointcut {

 public boolean matches(Method method, Class cls) {
   return ("foo".equals(method.getName()));
 }
 public boolean matches(Method method, Class cls, Object[] args) {
   int x = (Integer) args[0];
   return (x != 100);
 }
 public ClassFilter getClassFilter() {
   return new ClassFilter() {
     public boolean matches(Class cls) {
       return (cls == MyClass.class);
     }
   };
 }

}


      </source>
   
  
 
  



Create A Benchmark with MethodInterceptor

   <source lang="java">
      

File: Main.java import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.framework.ProxyFactory; import org.springframework.util.StopWatch; public class Main {

 public static void main(String[] args) {
   Main target = new Main();
   ProxyFactory factory = new ProxyFactory();
   factory.setTarget(target);
   factory.addAdvice(new ProfilingInterceptor());
   Main bean = (Main) factory.getProxy();
   bean.doSomeWork(10);
 }
 public void doSomeWork(int noOfTimes) {
   for (int x = 0; x < noOfTimes; x++) {
   }
 }

} class ProfilingInterceptor implements MethodInterceptor {

 public Object invoke(MethodInvocation invocation) throws Throwable {
   StopWatch sw = new StopWatch();
   sw.start(invocation.getMethod().getName());
   Object returnValue = invocation.proceed();
   sw.stop();
   System.out.println("Executed method: " + invocation.getMethod().getName());
   System.out.println("On object of type: " + invocation.getThis().getClass().getName());
   System.out.println("With arguments:");
   for (int x = 0; x < invocation.getArguments().length; x++) {
     System.out.print(invocation.getArguments()[x]);
   }
   return returnValue;
 }
 
   

}


      </source>
   
  
 
  



Implements MethodInterceptor to check the invocation method name

   <source lang="java">
      

File: Main.java import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.Advisor; import org.springframework.aop.framework.ProxyFactory; import org.springframework.aop.support.DefaultPointcutAdvisor; import org.springframework.aop.support.NameMatchMethodPointcut; public class Main {

 public static void main(String[] args){
   MyClass target = new MyClass();
   NameMatchMethodPointcut pc = new NameMatchMethodPointcut();
   pc.addMethodName("foo");
   pc.addMethodName("bar");
   Advisor advisor = new DefaultPointcutAdvisor(pc, new SimpleAdvice());
   ProxyFactory pf = new ProxyFactory();
   pf.setTarget(target);
   pf.addAdvisor(advisor);
   MyClass proxy = (MyClass)pf.getProxy();
   proxy.foo();
   proxy.foo(1);
   proxy.bar();
   proxy.yup();
 }

} class SimpleAdvice implements MethodInterceptor {

 public Object invoke(MethodInvocation invocation) throws Throwable {
     System.out.println("start: " + invocation.getMethod().getName());
     Object retVal = invocation.proceed();
     System.out.println("end");
     return retVal;
 }

} class MyClass {

 public void foo() {
     System.out.println("foo");
 }
 public void foo(int x) {
     System.out.println("foo " + x);
 }
 public void bar() {
     System.out.println("bar");
 }
 public void yup() {
     System.out.println("yup");
 }

}


      </source>
   
  
 
  



Implements MethodInterceptor To Create Profiling Advice

   <source lang="java">
      

File: context.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

   "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

 <bean id="afterBean" class="org.springframework.aop.framework.ProxyFactoryBean">
   <property name="target">
     <bean class="MtBean">
       <property name="firstName" value="AAA"/>
     </bean>
   </property>
   <property name="interceptorNames">
     <list>
       <idref bean="profilingAdvice"/>
     </list>
   </property>
   <property name="proxyTargetClass" value="true"/>
 </bean>
 <bean id="profilingAdvice" class="SimpleProfilingAroundAdvice"/>

</beans>

File: Main.java import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.util.StopWatch; public class Main {

 public static void main(String[] args) throws Exception {
   BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("context.xml"));
   MtBean testBean = (MtBean) beanFactory
       .getBean("afterBean");
   testBean.showValues();
 }

} class MtBean {

 private String firstName;
 public String getFirstName() {
   return this.firstName;
 }
 public void setFirstName(String firstName) {
   this.firstName = firstName;
 }
 public void showValues() {
   System.out.println("First name: " + this.firstName);
 }

} class SimpleProfilingAroundAdvice implements MethodInterceptor {

 public Object invoke(MethodInvocation invocation) throws Throwable {
   StopWatch stopWatch = new StopWatch();
   stopWatch.start();
   try {
     return invocation.proceed();
   } finally {
     stopWatch.stop();
     System.out.println(stopWatch.prettyPrint());
   }
 }

}


      </source>