Java Tutorial/Spring/ProxyFactory — различия между версиями

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

Текущая версия на 15:22, 31 мая 2010

Add Advice To ProxyFactory

File: Main.java



import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.framework.ProxyFactory;
public class Main {
  public static void main(String[] args) throws Exception {
    MessageWriter target = new MessageWriter();
    ProxyFactory pf = new ProxyFactory();
    pf.addAdvice(new MessageDecorator());
    pf.setTarget(target);
    MessageWriter proxy = (MessageWriter) pf.getProxy();
    target.writeMessage();
    System.out.println("");
    proxy.writeMessage();
  }
}
class MessageWriter {
  public void writeMessage() {
      System.out.print("A");
  }
}
class MessageDecorator implements MethodInterceptor {
  public Object invoke(MethodInvocation invocation) throws Throwable {
      System.out.print("B ");
      Object retVal = invocation.proceed();
      System.out.println("C");
      return retVal;
  }
}





Invoke Method Through Proxy

File: Main.java



import java.lang.reflect.Method;
import org.springframework.aop.Advisor;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.Pointcut;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.ControlFlowPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
public class Main {
  public static void main(String[] args) {
    TestBean target = new TestBean();
    Pointcut pc = new ControlFlowPointcut(Main.class, "test");
    Advisor advisor = new DefaultPointcutAdvisor(pc, new SimpleBeforeAdvice());
    ProxyFactory pf = new ProxyFactory();
    pf.setTarget(target);
    pf.addAdvisor(advisor);
    TestBean proxy = (TestBean) pf.getProxy();
    proxy.foo();
    test(proxy);
  }
  static void test(TestBean bean) {
    bean.foo();
  }
}
class TestBean {
  public void foo() {
    System.out.println("foo");
  }
}
class SimpleBeforeAdvice implements MethodBeforeAdvice {
  public void before(Method method, Object[] args, Object target) throws Throwable {
    System.out.println("Before method " + method);
  }
}





Proxy Factory Add Advisor

File: Main.java



import java.lang.reflect.Method;
import org.aopalliance.aop.Advice;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.Advisor;
import org.springframework.aop.ClassFilter;
import org.springframework.aop.Pointcut;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.StaticMethodMatcherPointcut;
public class Main {
  public static void main(String[] args) {
    BeanOne one = new BeanOne();
    BeanTwo two = new BeanTwo();
    BeanOne proxyOne;
    BeanTwo proxyTwo;
    Pointcut pc = new SimpleStaticPointcut();
    Advice advice = new SimpleAdvice();
    Advisor advisor = new DefaultPointcutAdvisor(pc, advice);
    ProxyFactory pf = new ProxyFactory();
    pf.addAdvisor(advisor);
    pf.setTarget(one);
    proxyOne = (BeanOne) pf.getProxy();
    pf = new ProxyFactory();
    pf.addAdvisor(advisor);
    pf.setTarget(two);
    proxyTwo = (BeanTwo) pf.getProxy();
    proxyOne.foo();
    proxyTwo.foo();
    proxyOne.bar();
    proxyTwo.bar();
  }
}
class BeanTwo {
  public void foo() {
    System.out.println("BeanTwo.foo");
  }
  public void bar() {
    System.out.println("BeanTwo.bar");
  }
}
class BeanOne {
  public void foo() {
    System.out.println("BeanOne.foo");
  }
  public void bar() {
    System.out.println("BeanOne.bar");
  }
}
class SimpleAdvice implements MethodInterceptor {
  public Object invoke(MethodInvocation invocation) throws Throwable {
    System.out.println("SimpleAdvice.Invoking " + invocation.getMethod().getName());
    Object retVal = invocation.proceed();
    System.out.println("SimpleAdvice.Done");
    return retVal;
  }
}
class SimpleStaticPointcut extends StaticMethodMatcherPointcut {
  public boolean matches(Method method, Class cls) {
    return ("foo".equals(method.getName()));
  }
  public ClassFilter getClassFilter() {
    return new ClassFilter() {
      public boolean matches(Class cls) {
        return (cls == BeanOne.class);
      }
    };
  }
}