准备

 

我们来分析一下上节课的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里面的是切点表达式(通过一个表达式可以指定多个切点方法)。这节课主要讲before位置的参数,接下来会着重学习 '通知(也叫增强)的种类'

 

 

通知(也叫增强)的种类

 

通知的配置语法,下面讲的目标方法指的是切点表达式里面的方法,例如save方法,该方法也叫切点方法:

名称标签说明
前置通知< aop:before >在目标方法之前执行
后置通知< aop:after-returning >在目标方法之后执行
环绕通知< aop:around >在目标方法之前和之后都执行
异常抛出通知< aop:after-throwing >当目标方法出现异常后执行
最终通知< aop:after >无论目标方法执行是否有异常都会执行

 

上面的'通知'也叫'增强',我们通常写的时候写'通知',读的时候读'增强'

 

具体操作:

 

第一步: 把MyAspect类修改为如下

 

第二步: 在applicationContext.xml里面的'<aop:before method="before_met" pointcut="execution(* com.huanf.aop..(..))"/>'的下一行添加如下

 

第三步: 在AopTest类里面运行,即可测试前置增强和后置增强

 

第四步: 把MyAspect类修改为如下

 

第五步: 在applicationContext.xml里面,把上面第2步的配置注释了,然后添加如下,原因:'前置增强后置增强'和'环绕增强'能实现相同的效果,所以以示区分 即注释aop:aspect标签里面的aop:beforeaop:after-returning 添加如下

 

第六步: 在AopTest类里面运行,即可测试环绕增强

 

第七步: 把MyAspect类修改为如下

 

第八步: 把Target类修改为如下

 

第九步: 在applicationContext.xml里面添加如下

 

第十步: 在AopTest类里面运行,即可测试异常抛出后增强。运行后会在控制台输出: 异常抛出后增强 -- xml方式实现aop、/ by zero报错

 

第十一步: 在MyAspect类里面添加如下

 

第十二步: 在applicationContext.xml里面添加如下

 

第十三步: 在AopTest类里面运行,即可测试异常抛出后增强。运行后会在控制台输出: 最终增强 -- xml方式实现aop、/ by zero报错

 

第十四步: 为了方便,我把Target类修改为如下