1、背景
之前的文章中,有网友提出了一个问题,同一个方法用多个AOP修饰,执行顺序是怎样的?
好问题,之前没有关注过,这里写一个demo跑一下看看
同时有一个衍生问题,多个AOP修饰,会生成几个代理对象?
如果一个切面中捕捉到了异常并且吞掉了,其他切面还能捉到异常吗?
okk,我们带着问题进行出发
2、代码准备
被切的方法:
这里准备了3个注解和3个注解对应的切面,其中3个切面分别定义了不同的Order顺序
3、测试
1)执行属性是否按照Order中的顺序 ,还是按照注解在方法上的顺序
可以看到,是会按照Order的顺序,由小到大来执行的,有点嵌套的感觉
2)当没有Order或者Order的值一样时,执行顺序是怎样的?
我们把Order顺序都改为5,@Order(5)
发现也没有按照注解在方法的顺序执行,我们再加一个切面试试,这里我们加了一个logAOPV2
执行顺序:
似乎和java文件的顺序有关系,这里不太好验证,如果有顺序需要,可以在Order中显示定义
3) 生成了几个代理对象?
我们使用 System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, “D:\cglib”);
将动态代理生成的类输出到指定路径
发现生成了3个class文件,我们分别进去看一下
其实只有一个类是继承了AopService,也就是说真正的代理类只有一个
打个断点继续印证一下观点:
果然每个切面中的ProceedingJoinPoint引用的都是同一个代理对象
留一个问题:一个代理类,怎么实现多个AOP的功能呢?
4)嵌套最里边的切面捕捉到了异常,并吞掉,外层切面还能捕获异常吗?
不会了,需要做完处理后再抛出来才行