四种常用通知类型,配切入点表达式(标签)
涉及到的新标签: <aop:after-returning>, <aop:after-throwing>, <aop:after>,<aop:pointcut>
一、四种常用通知类型
我们修改一下Logger类,添加多三个方法。
接着,我们配置一下四个通知,用到了三个新的标签。
<aop:after-returning>, <aop:after-throwing>, <aop:after>
运行测试一下,没有问题。
我们发现并没有异常通知,因为我们的程序没有产生异常通知,所以没有,那么我们现在对service改造一下,我们给他加上一个异常。
接着运行一下,没有问题,异常通知有了,但我们发现后置通知没有了,因为它跟后置通知只能有一个。
二、配置切入点表达式
我们发现,我们上面的切入点表达式,大多数都是相同的,那有没有更好的简单的方式呢?
答案肯定是有的,可以另行配置,缩减。
这就用到了一个新标签:<aop:pointcut>
直接看图片吧:
我们运行测试一下,没有任何问题。
那么现在,我们把这个标签从<aop:aspect>
标签内移出来,放到下面去,我们发现它红线报错了,什么原因呢?
这是因为我们导入的约束导致的,约束已经做了规定,不能这样写,有规定的写法,位置。
我们必须把它放在<aop:aspect>
标签的前面就可以了,不能放在后面,这样就不会报错了。
三、最后一种通知类型:环绕通知
用到一个新标签:<aop:around>
我们先把之前的四种通知类型给注释上,再写一个环绕通知。我们发现环绕通知报错了,因为它还没有这个方法,我们待会把它加上去就可以了。
我们把环绕通知的方法写上去
接着,我们运行测试一下,我们发现一个非常奇怪的问题,我们的环绕方法执行了,可以调用的service方法并没有执行,为什么呢?
接下来,我们就分析一下:直接看图吧
我们讲的四种通知类型都是通过配置的方式来手动指定,来通过配置指定增强的代码什么时候执行,而现在我们是通过使用代码控制的方式来指定增强的代码何时执行。
所以说,spring的环绕通知它有另外的一种解释:
它是spring框架为我们提供的一种可以在代码中手动控制增强方法何时执行的方式。
也就是说,我们除了靠配,可以实现,也可以通过自己编码来实现,那自己编码的实现方式就是环绕通知的方式。