spring的aspect

114 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

今天来聊一聊spring的aspect切面使用,在上篇无侵入式日志文章使用到了切面来完成日志记录,这篇文章就来聊聊五种aspect的使用。

@Before: 注解指定的方法在切面切入目标方法之前执行,可以做一些 Log 处理,也可以做一些信息的统计,比如获取用户的请求 URL 以及用户的 IP 地址等等

image.png

@After: 注解和 @Before 注解相对应,指定的方法在切面切入目标方法之后执行,也可以做一些完成某方法之后的 Log 处理。

image.png

@AfterThrowing: 当被切方法执行过程中抛出异常时,会进入 @AfterThrowing 注解的方法中执行,在该方法中可以做一些异常的处理逻辑。 要注意的是 throwing 属性的值必须要和参数一致,否则会报错。该方法中的第二个入参即为抛出的异常。

image.png

@AfterReturning : 注解和 @After 有些类似,区别在于 @AfterReturning 注解可以用来捕获切入方法执行完之后的返回值,对返回值进行业务逻辑上的增强处理

image.png

@Around: 可以自由选择增强动作与目标方法的执行顺序,也就是说可以在增强动作前后,甚至过程中执行目标方法。这个特性的实现在于,调用ProceedingJoinPoint参数的procedd()方法才会执行目标方法。@Around可以改变执行目标方法的参数值,也可以改变执行目标方法之后的返回值。

image.png

那么before、after、afterThrowing、afterReturning、around这五种切面方式的执行顺序是如何呢?这里我使用注解结合切面的方式给方法MyTest作用于切面下,如下图:

image.png

image.png

第一次测试先正常传参数,执行结果如下:

image.png

可以发现在接口未发生错误的情况下,执行顺序是around > before > after > afterReturning

如果发送错误呢?那么情况执行顺序是什么,around是否还会执行(因为around会调用process执行方法)? 如下图:

image.png

根据上图显示可以发现around是执行了的,但是afterReturning没有执行也可以理解,原因就是程序报错无法执行返回。其实使用注解结合切面的方式对控制日志的粒度更细,不需要记录日志的方法可以不加注解即可,除了日志场景还可以使用到风控检查,以及mysql的读写分离都可以使用此思路实现。