1.概念
连接点(join point):程序中明确定义的一个点,这个点可以是属性、构造函数和方法。
pointcut:作用是对特定的连接点分组,其格式如下:
pointcut name([parameters]) : designator(ajoinpoint);
说明:designator是指示符,它指示一个连接点应该在什么时候连接到一个pointcut,常用的有:
1)call-对方法和构造函数的调用进行匹配
2)execution-对方法和构造函数的调用进行匹配
3)initialization-对构造函数进行匹配
4)handler-对异常值进行匹配
5)get-对属性的引用进行匹配
6)set-对属性的赋值进行匹配
7)this-返回与特定连接点相关的对象或利用一个类的类型来限制连接点的范围
8)target-返回连接点的目标对象或限制连接点的范围
9)args-将参数透露给连接点或限制连接点的范围
10)cflow-返回另一个连接点执行流程中的连接点
11)cflowbelow-返回另一个连接点执行流程中的连接点,但不包括当前连接点
12)staticinitialization-对类的静态初始化代码的执行方式进行匹配
13)withincode-对一个方法或构造函数内部的连接点进行匹配
14)within-对某特定类型的连接点进行匹配
15)if-允许连接点包含动态条件
16)adviceexception-在advice连接点上进行匹配
17)preinitialization-对预初始化连接点进行匹配
对指示符可以使用逻辑运算来组合:
1)&&(and)-操作符的两个参数都为真的时候匹配
2)||(or)-只要有一个为真就匹配
3)!(not)-匹配所有与pointcut定义不相称的连接点
2.实例讨论(这一部分的讨论都基于下面的Simple类)
package net.wide.aop.aspectj;
public class Simple { private String name = "Hello World!"; public Simple(){ System.out.println("创建Simple完毕"); } public String getName(){ return this.name; } public void setName(String name){ this.name = name; System.out.println("set name to " + name); } public void print(){ System.out.println("print:" + name); } public void print(String s){ System.out.println(name + s); } public static void main(String[] args) { Simple simple = new Simple(); simple.print(); simple.print("andy"); System.out.println("get:" + simple.getName()); simple.setName("haha"); } } |
1) pointcut定义在构造函数
pointcut construct() : call(Simple.new());//initialization(Simple.new()); before() : construct(){ System.out.println("创建Simple"); } |
这里有两种方式来定义构造函数的pointcut,
A.一个是做为普通调用的函数用call来定义
B.一种是用initialization指示符,其效果是一样的。
2) pointcut定义在普通函数上
pointcut p1() : call(public void Simple.print());
before() : p1(){
System.out.println("before print==>");
}
pointcut p2() : call(public void Simple.print(String));
before() : p2(){
System.out.println("before print(String)==>");
}
3) pointcut定义在属性获取(get)方法上
pointcut getName() : get(private String Simple.name);
before() : getName(){
System.out.println("before getName==>");
}
4) pointcut定义在属性赋值(set)方法上
pointcut setName() : set(private String Simple.name);
before() : setName(){
System.out.println("before setName==>");
}