Spring Boot AOP中@Around是否为@Before等注解组合且可替代相关通知注解
Spring AOP @Around注解相关疑问解答
疑问1:@Around是不是@Before与@After的组合?
不能简单将@Around等同于@Before加@After的组合,它的能力范围远超过二者叠加:
- @Around是功能最强大的环绕通知,你可以在目标方法执行的全周期进行干预:
proceed()方法执行前的逻辑对应@Before的能力,proceed()执行后的逻辑对应@After的能力,同时你还可以选择不调用proceed()直接阻断目标方法执行、修改目标方法入参、修改返回值、捕获处理目标方法抛出的异常,这些是@Before、@After等单独通知无法实现的。 - 以下是典型的@Around通知实现示例:
@Around("myPointCut()") public Object applicationLogger(ProceedingJoinPoint joinPoint){ logger.info(" for the Method : " + joinPoint.getSignature().getName() + " Request received : {}", Arrays.toString(joinPoint.getArgs())); Object res = null; try { res = joinPoint.proceed(); logger.info(" for the Method :"+ joinPoint.getSignature().getName() + " Response received : {}", res); } catch (Throwable throwable) { throwable.printStackTrace(); } return res; }
疑问2:能不能只用@Around,完全替代@Before、@After、@AfterReturning等注解?
技术上@Around确实可以覆盖所有其他通知的能力,但实际开发中完全不推荐这么做,原因如下:
- 代码可读性差:如果仅需要在目标方法执行前做逻辑,用@Before注解的方法不需要处理
ProceedingJoinPoint,也不需要手动控制目标方法执行、处理返回值,代码逻辑非常直观,其他开发者一眼就能判断通知的执行时机。 - 出错风险更低:使用@Around时如果漏写
proceed()会直接阻断目标方法执行,漏写返回值会导致上层调用方拿到错误结果,这些问题在使用其他通知时完全不存在,框架会自动控制目标方法的执行流程。 - 代码更简洁:比如仅需要记录目标方法返回值时,用@AfterReturning的实现比@Around简洁很多:
@AfterReturning(pointcut = "myPointCut()", returning = "res") public void logReturn(JoinPoint joinPoint, Object res) { logger.info("方法 {} 返回值:{}", joinPoint.getSignature().getName(), res); }
- 排序逻辑更清晰:多个通知切同一个连接点时,明确的通知类型可以让框架自动处理执行顺序,全用@Around反而需要手动控制所有逻辑的先后,增加开发成本。
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

