相同目标方法上同时存在多个切面时,切面的优先级控制切面的内外嵌套顺序。
优先级高的切面:外面
优先级低的切面:里面
使用 @Order 注解可以控制切面的优先级:
@Order(较小的数):优先级高
@Order(较大的数):优先级低
注:@Order默认值为int类型的最大值
@Component //当前类交由ioc管理
@Aspect //开启aspect注解支持
@Order(1) //指定一个优先级的值,值越小,优先级越高!越高的前置先执行,后置后执行
public class LogAdvice {
/*
@Pointcut("execution(* com.suchuanlin.service.impl.*.*(..))")
public void pointcut(){}
*/
@Before("com.suchuanlin.pointcut.MyPointCut.pointcut()")
public void before(){
System.out.println("方法开始了...");
}
@After("com.suchuanlin.pointcut.MyPointCut.pointcut()")
public void after(){
System.out.println("方法结束了...");
}
@AfterThrowing("com.suchuanlin.pointcut.MyPointCut.pointcut()")
public void error(){
System.out.println("方法报错了...");
}
}
package com.suchuanlin.advice;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* 环绕通知
*/
@Component //加入ioc容器
@Aspect //标记为切面
@Order(2) //指定一个优先级的值,值越小,优先级越高!越高的前置先执行,后置后执行
public class AroundAdvice {
@Before("com.suchuanlin.pointcut.MyPointCut.pointcut()")
public void begin(){
System.out.println("开启事务...");
}
@AfterReturning("com.suchuanlin.pointcut.MyPointCut.pointcut()")
public void commit(){
System.out.println("提交事务...");
}
@AfterThrowing("com.suchuanlin.pointcut.MyPointCut.pointcut()")
public void rollback(){
System.out.println("回滚事务...");
}
}
文章讨论了在SpringAOP中,如何通过@Order注解控制相同目标方法上的多个切面的执行顺序,优先级高的切面在外部,较低的在内部。示例展示了如何在前置、后置和环绕通知中使用@Order来管理事务操作。



649

被折叠的 条评论
为什么被折叠?



