import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class SimpleBeforeAdvice implements MethodBeforeAdvice {
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("Before method: " + method);
}
}
////////////////////////////////////////////////////////////////////////////////// public class SampleBean {
public String getName() { return "Rob Harrop";
}
public void setName(String name) {
}
public int getAge() { return 100;
}
}
////////////////////////////////////////////////////////////////////////////////// import java.lang.reflect.Method;
import org.springframework.aop.Advisor; import org.springframework.aop.ClassFilter; import org.springframework.aop.framework.ProxyFactory; import org.springframework.aop.support.ComposablePointcut; import org.springframework.aop.support.DefaultPointcutAdvisor; import org.springframework.aop.support.StaticMethodMatcher;
public class ComposablePointcutExample {
public static void main(String[] args) {
// create target
SampleBean target = new SampleBean();
ComposablePointcut pc = new ComposablePointcut(ClassFilter.TRUE, new GetterMethodMatcher());
System.out.println("Test 1");
SampleBean proxy = getProxy(pc, target);
testInvoke(proxy);
System.out.println("Test 2");
pc.union(new SetterMethodMatcher());
proxy = getProxy(pc, target);
testInvoke(proxy);
System.out.println("Test 3");
pc.intersection(new GetAgeMethodMatcher());
proxy = getProxy(pc, target);
testInvoke(proxy);
}
private static SampleBean getProxy(ComposablePointcut pc, SampleBean target) {
// create the advisor
Advisor advisor = new DefaultPointcutAdvisor(pc, new SimpleBeforeAdvice());
// create the proxy
ProxyFactory pf = new ProxyFactory();
pf.setTarget(target);
pf.addAdvisor(advisor);
return (SampleBean) pf.getProxy();
}
private static void testInvoke(SampleBean proxy) {
proxy.getAge();
proxy.getName();
proxy.setName("Rob Harrop");
}
private static class GetterMethodMatcher extends StaticMethodMatcher {
public boolean matches(Method method, Class cls) { return (method.getName().startsWith("get"));
}
}
private static class GetAgeMethodMatcher extends StaticMethodMatcher { public boolean matches(Method method, Class cls) { return "getAge".equals(method.getName());
}
}
private static class SetterMethodMatcher extends StaticMethodMatcher {
public boolean matches(Method method, Class cls) { return (method.getName().startsWith("set"));
}
}
}
|
|