Spring Boot AspectJ同切点多切面优先级设置:新切面异常如何被已有异常切面处理
问题解答
你需要将NewAspect的Order值设置为大于0即可满足需求。
原理说明
Spring AOP中多个匹配同一切点的切面执行顺序遵循以下规则:
@Order注解的值越小,切面优先级越高,执行时会处于更外层的调用链路- 整个调用链路类似栈结构:优先级高的切面先进入,后退出;优先级低的切面后进入,先退出
- 异常会沿着调用链路从内向外抛出,只有外层切面的
@AfterThrowing通知能捕获内层切面/目标方法抛出的异常
你现有的ExceptionAspect优先级为0,要让它能捕获NewAspect抛出的异常,就需要让ExceptionAspect处于外层,NewAspect处于内层,因此NewAspect的优先级要低于ExceptionAspect,也就是Order值大于0。
代码示例
@Aspect @Order(1) // 只要数值大于0即可,值越大优先级越低 public class NewAspect { @Pointcut("within(com.mycom.service.impl..*)") public void applicationServicePointcut() { } // 示例使用@Before通知,你可以根据需求替换为其他类型通知 @Before("applicationServicePointcut()") public void doBefore(JoinPoint joinPoint) { // 此处抛出的所有异常都会被外层的ExceptionAspect捕获处理 // 你的业务逻辑 } }
注意事项
- 如果
NewAspect中使用@Around通知,不要手动捕获异常后不抛出,否则外层的ExceptionAspect无法接收到异常 NewAspect的Order值没有强制要求固定数值,只要大于0即可满足需求
内容的提问来源于stack exchange,提问作者Joy
相关产品推荐
相关产品推荐

