Spring AOP @Before @Around @After 等 advice 的执行顺序
单个切面
正常情况:
异常情况:
多个切面
给aspect添加@Order注解,可以顺序执行,否则无序执行
详细讲解
说明:定义了around方法,必须返回point.proceed();否则拦截点后方法不执行
代码实现
controller代码
@RestController
public class TestContreller {
@RequestMapping("test")
//标签切入
@log
public String test(){
System.out.println("test()");
return "测试";
}
}
log注解
//注解用在方法上
@Target(ElementType.METHOD)
//注解的存活期
@Retention(RetentionPolicy.RUNTIME)
public @interface log {
}
切点为注解(aop1)
public class ContrellerLogTarget implements Ordered{
@Pointcut("@annotation(com.example.demo.aop.log)")
public void logPointCut(){
}
@Before("logPointCut()")
public void before(){
System.out.println("-------------------------------");
System.out.println("beforeTarget()");
System.out.println("-------------------------------");
}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
System.out.println("-------------------------------");
System.out.println("aroundTarget()");
System.out.println("-------------------------------");
Object ob=point.proceed();
return ob;
}
@After("logPointCut()")
public void after(){
System.out.println("-------------------------------");
System.out.println("afterTarget()");
System.out.println("-------------------------------");
}
@AfterReturning("logPointCut()")
public void afterReturn(){
System.out.println("-------------------------------");
System.out.println("afterReturnTarget()");
System.out.println("-------------------------------");
}
@Override
public int getOrder() {
return 0;
}
}
切点为controller类
@Aspect
@Configuration
public class ContrellerLog implements Ordered {
@Pointcut("execution(* com.example..controller.*.*(..))")
public void logPointCut(){
}
@Before("logPointCut()")
public void before(){
System.out.println("-------------------------------");
System.out.println("before()");
System.out.println("-------------------------------");
}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
System.out.println("-------------------------------");
System.out.println("around()");
System.out.println("-------------------------------");
Object ob=point.proceed();
return ob;
}
@After("logPointCut()")
public void after(){
System.out.println("-------------------------------");
System.out.println("after()");
System.out.println("-------------------------------");
}
@AfterReturning("logPointCut()")
public void afterReturn(){
System.out.println("-------------------------------");
System.out.println("afterReturn()");
System.out.println("-------------------------------");
}
@Override
public int getOrder() {
return 100;
}
}
运行结果:
-------------------------------
aroundTarget()
-------------------------------
-------------------------------
beforeTarget()
-------------------------------
-------------------------------
around()
-------------------------------
-------------------------------
before()
-------------------------------
test()
-------------------------------
after()
-------------------------------
-------------------------------
afterReturn()
-------------------------------
-------------------------------
afterTarget()
-------------------------------
-------------------------------
afterReturnTarget()
-------------------------------