package cuigh.spring.aop.step02;
import org.aopalliance.aop.Advice;
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 NameMatchMethodPointcutExample {
/**
* 功能:演示简单的名字匹配
*/
public static void main(String[] args) {
//创建目标对象
Math1 math1 = new Math1();
Math2 math2 = new Math2();
Math1 math1Proxy;
Math2 math2Proxy;
int a=10,b=2;
//创建切入点
//Pointcut pointcut = new MyStaticPoincut();
NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();
//只通知 add() 方法
pointcut.addMethodName("add");
//创建通知
Advice advice = new MyAdvice();
//创建通知者
Advisor advisor = new DefaultPointcutAdvisor(pointcut, advice);
//创建目标对象 math1 的代理
ProxyFactory pf = new ProxyFactory();
//设置通知者
pf.addAdvisor(advisor);
//设置目标对象
pf.setTarget(math1);
math1Proxy = (Math1)pf.getProxy();
math1Proxy.add(a, b);
math1Proxy.sub(a, b);
System.out.println("------------------------------");
//创建目标对象 math12的代理
pf = new ProxyFactory();
//设置目标对象
pf.setTarget(math2);
//设置通知者
pf.addAdvisor(advisor);
math2Proxy = (Math2)pf.getProxy();
math2Proxy.add(a, b);
math2Proxy.sub(a, b);
}
}
上篇演示了静态方法匹配器的使用,下面把其它使用方法也举例使用一下。
- spring动态方法匹配器切入点使用
package cuigh.spring.aop.step02;
import java.lang.reflect.Method;
import org.springframework.aop.support.DynamicMethodMatcherPointcut;
public class MyDynamicPointcut extends DynamicMethodMatcherPointcut {
/*
* public boolean matches(Method method, Class<?> targetClass) {
* 与StaticMethodMatcherPointcut相比,多一个参数:args,可以对参数在更细致的通知
* */
@Override
public boolean matches(Method method, Class<?> targetClass, Object[] args) {
// TODO Auto-generated method stub
System.out.println("实现类="+this.getClass().getName());
return ( ("sub".equals(method.getName()) && (targetClass==Math1.class))
|| ("add".equals(method.getName()) && (targetClass==Math2.class))
);
}
}
package cuigh.spring.aop.step02;
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;
/**
* 功能:演示spring动态方法匹配器切入点使用
*/
public class AdvisorDynamicExample {
public static void main(String[] args) {
//创建目标对象
Math1 math1 = new Math1();
Math2 math2 = new Math2();
Math1 math1Proxy;
Math2 math2Proxy;
int a=10,b=2;
//创建切入点
Pointcut pointcut = new MyDynamicPointcut();
//创建通知
Advice advice = new MyAdvice();
//创建通知者
Advisor advisor = new DefaultPointcutAdvisor(pointcut, advice);
//创建目标对象 math1 的代理
ProxyFactory pf = new ProxyFactory();
//设置通知者
pf.addAdvisor(advisor);
//设置目标对象
pf.setTarget(math1);
math1Proxy = (Math1)pf.getProxy();
math1Proxy.add(a, b);
math1Proxy.sub(a, b);
System.out.println("------------------------------");
//创建目标对象 math12的代理
pf = new ProxyFactory();
//设置目标对象
pf.setTarget(math2);
//设置通知者
pf.addAdvisor(advisor);
math2Proxy = (Math2)pf.getProxy();
math2Proxy.add(a, b);
math2Proxy.sub(a, b);
}
}
2 简单的名字匹配
3 JDK正则表达式匹配
package cuigh.spring.aop.step02;
import org.aopalliance.aop.Advice;
import org.springframework.aop.Advisor;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.JdkRegexpMethodPointcut;
public class RegexpMethodPointcutExample {
/**
* 功能:演示JDK正则表达式匹配
*/
public static void main(String[] args) {
//创建目标对象
Math1 math1 = new Math1();
Math2 math2 = new Math2();
Math1 math1Proxy;
Math2 math2Proxy;
int a=10,b=2;
//创建切入点
JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut();
//只通知 sub() 方法
pointcut.setPattern(".*sub.*");
//创建通知
Advice advice = new MyAdvice();
//创建通知者
Advisor advisor = new DefaultPointcutAdvisor(pointcut, advice);
//创建目标对象 math1 的代理
ProxyFactory pf = new ProxyFactory();
//设置通知者
pf.addAdvisor(advisor);
//设置目标对象
pf.setTarget(math1);
math1Proxy = (Math1)pf.getProxy();
math1Proxy.add(a, b);
math1Proxy.sub(a, b);
System.out.println("------------------------------");
//创建目标对象 math12的代理
pf = new ProxyFactory();
//设置目标对象
pf.setTarget(math2);
//设置通知者
pf.addAdvisor(advisor);
math2Proxy = (Math2)pf.getProxy();
math2Proxy.add(a, b);
math2Proxy.sub(a, b);
}
}