一、执行顺序:
正常顺序:@Around->@Before->具体的方法->@Around->@After->@AfterReturning
方法出现异常:@Around->@Before->具体的方法->@After->@AfterThrowing
二、有多个切面
1、执行顺序:后一个切面在前一个切面的“具体的方法“处执行,“具体的方法”放到后一个切面类:AspectA around > AspectA before > AspectB around > AspectB brfore > “具体的方法” > AspectB around > AspectB after > AspectB afterReturning > AspectA around > AspectA after > AspectA afterRerurning
方法出现异常:执行顺序和上面类似
多个切面的执行顺序
1、执行顺序没有指定,使用多个切面的时候执行顺序自然也是未知的,所以使用@Order(value = 10)指定顺序,value小的先执行。
2、使用JRebel进行程序之后加@Order没用!!!
三、并发下的AOP
1、场景:使用AOP实现方法耗时的计算。
2、方法:在@Aound 里面proceed()执行之前记录开始时间,@After记录结束时间,进而算出消耗的时间。
3、问题:在并发的情况下,保证记录的开始时间不会被另一个请求覆盖。
4、解决: 把开始时间绑定到线程上,即使用ThreadLocal
其他:测试并发的工具Apacha JMeter
关于ThreadLocal类
使用:
结果:
35是使用普通的全局变量存储的
31>32…是使用ThreadLocal存储的值