AspectJ-连接点join point

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==>");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值