准备

 

我们来分析一下上节课的application.xml里面代码的写法

原写法:

 

首先分析aop:config标签里面的写法:

1、aop:config: aop的配置

2、<aop:aspect ref="xxx">: 声明切面,ref指定某个类里面的切面

3、<aop:kkk method="xxx" pointcut="execution(yyy)"/>:kkk表示是前置增强还是后置增强,yyy方法(切点方法)+xxx方法(增强方法)=切面,pointcut里面的 是切点表达式(通过一个表达式可以指定多个切点方法)

这节课主要讲pointcut切点表达式,接下来会着重学习 '切点表达式怎么写'

 

切点表达式的写法

 

表达式语法:

execution([修饰符] 表达值类型 包名.类名.方法名(参数))

1、修饰符可以省略,一般我们写的时候都是习惯省略

2、返回值类型、包名、类名、方法名可以使用*代表任意

3、包名与类名之间一个点.代表当前包下的类,两个点..代表当前包及其子包下的类

4、如果有多个参数,可以使用..代表,任意参数个数

 

例如如下,下面所说的'方法'指的是'被增强的方法':

表达式作用
execution(public void com.huanf.aop.Target.method())表示必须是com.huanf.aop包下的Target类的method方法,并method方法没有返回值
execution(void com.huanf.aop.Target.*(..))表示必须是com.huanf.aop包下的Target类,方法可以是Target类里面的全部方法,这些方法如果没有返回
execution(* com.huanf.aop..(..))常用写法,表示com.huanf.aop包下的全部类的全部方法(方法可以是任意返回值)都能被增强
execution(* com.huanf.aop...(..))表示com.huanf.aop包及其子包下的全部类的全部方法(方法可以是任意返回值)都能被增强
execution(* ...*(..))没意义,不要这样写

 

具体操作:

去applicationContext.xml里面把切点表达式修改为如下

 

 

切点表达式的抽取

 

pointcut: 切点表达式

根据上面的分析,当我们已经配置了多个<aop:xxx method="yyy" pointcut="execution(* com.huanf.aop..(..))"/>,也就是配置了多个增强(也叫通知),如果这多个增强的 切点表达式相同,也就是相同的pointcut="execution(* com.huanf.aop..(..))",那我们就可以把切点表达式抽取出来

当多个增强的切点表达式相同时,可以将切点表达式进行抽取,在增强中使用pointcut-ref属性代替pointcut属性来引用抽取后的切点表达式

 

具体操作:

第一步: 把applicationContext.xml里面的aop:config标签改为如下

第二步: 在AopTest类进行运行测试