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 簡單的名字匹配
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);
}
}