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