Spring AOP (三)
Spring AOP (三)
昨天学习了切入连接点,简单学习了NameMatchMethodPointcut模式和正则匹配模式,今天再深入学习下
Pointcut操作
在org.springframework.aop.support.Pointcuts
的这个包中包含了一些静态方法,这些静态方法可以帮助我们组合多个不同的Pointcut。其中最重要的两个方法就是intersection(交集)和union(并集)。现在我们分别进行介绍。
Intersection
Intersection运算两个Pointcut的交集,然后返回一个新的包含交集的Pointcut,源代码是:
public static Pointcut intersection(Pointcut pc1, Pointcut pc2) {
return new ComposablePointcut(pc1).intersection(pc2);
}
可以看到,这个方法接受两个连接点参数,返回新的连接点集合对象。
简单测试类
package boy.aop.pointcut;
import boy.aop.advice.BeforeMethod;
import org.springframework.aop.Advisor;
import org.springframework.aop.Pointcut;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.JdkRegexpMethodPointcut;
import org.springframework.aop.support.Pointcuts;
/**
* Created by Boy on 2016/12/13 21:53.
*/
public class IntersectionPC {
public static void main(String arg[]){
PointcutMethod target = new PointcutMethod();
//设置pc1
JdkRegexpMethodPointcut pc1 = new JdkRegexpMethodPointcut();
pc1.setPattern(".*get.*");
//设置pc2
JdkRegexpMethodPointcut pc2 = new JdkRegexpMethodPointcut();
pc1.setPattern(".*me$");
//开始交集运算
Pointcut pc = Pointcuts.intersection(pc1, pc2);
Advisor advisor = new DefaultPointcutAdvisor(pc, new BeforeMethod());
//使用ProxyFactory
ProxyFactory pf = new ProxyFactory();
pf.addAdvisor(advisor);
pf.setTarget(target);
PointcutMethod proxy = (PointcutMethod) pf.getProxy();
//执行taget
proxy.setAge(22);
proxy.setName("Boy");
proxy.setTitle("boy@b521.net");
proxy.getAge();
proxy.getName();
proxy.getTitle();
}
}
运行结果
我们处理 setAge 方法
我们处理 setName 方法
我们处理 setName 方法
我们处理 getAge 方法
BeforeMethod : now we start before!
我们处理 getName 方法
我们处理 getName 方法
可以看到通知成功匹配到getName了。
Union
知道了Intersection,union就差不多了,和它是一个组合,一个交集一个并集。
简单测试类
package boy.aop.pointcut;
import boy.aop.advice.BeforeMethod;
import org.springframework.aop.Advisor;
import org.springframework.aop.Pointcut;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.JdkRegexpMethodPointcut;
import org.springframework.aop.support.Pointcuts;
/**
* Created by Boy on 2016/12/13 22:58.
*/
public class UnionPc {
public static void main(String arg[]){
PointcutMethod target = new PointcutMethod();
//设置pc1
JdkRegexpMethodPointcut pc1 = new JdkRegexpMethodPointcut();
pc1.setPattern(".*get.*");
//设置pc2
JdkRegexpMethodPointcut pc2 = new JdkRegexpMethodPointcut();
pc1.setPattern(".*set.*");
//开始交集运算
Pointcut pc = Pointcuts.union(pc1, pc2);
Advisor advisor = new DefaultPointcutAdvisor(pc, new BeforeMethod());
//使用ProxyFactory
ProxyFactory pf = new ProxyFactory();
pf.addAdvisor(advisor);
pf.setTarget(target);
PointcutMethod proxy = (PointcutMethod) pf.getProxy();
//执行taget
proxy.setAge(22);
proxy.setName("Boy");
proxy.setTitle("boy@b521.net");
proxy.getAge();
proxy.getName();
proxy.getTitle();
}
}
运行结果
BeforeMethod : now we start before!
我们处理 setAge 方法
BeforeMethod : now we start before!
我们处理 setName 方法
BeforeMethod : now we start before!
我们处理 setName 方法
我们处理 getAge 方法
我们处理 getName 方法
我们处理 getName 方法
可以看到,正则匹配到了我们的set方法。
在Pointcuts这个类中集中了一些对Pointcut进行操作的工具类,例如equals,可以检测两个Pointcut是否完全相同。
主要的注意点还是正则(正则太不熟练了,还要多练),今天排错排了一下午,差点这篇文章就写不出来了。不过最终还是完成了。
最后由 不一样的少年 编辑于2016年12月14日 23:12