正常情况下的通知执行顺序
先创建个SpringBoot应用。代码如下
@RestController
public class UserController {
@RequestMapping("first")
public BaseResVO first(){
return BaseResVO.ok();
}
@RequestMapping("/second")
@UserAccess(desc = "second")
public Object second() {
return "second controller";
}
@RequestMapping("/doError")
public Object error() {
return 1 / 0;
}
}
再写个注解
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface UserAccess {
String desc() default "无信息";
}
然后写个切面类
@Aspect
@Component
public class UserAccessAspect {
@Pointcut(value = "@annotation(com.cskaoyan.demo1.annotations.UserAccess)")
public void access(){
}
@Before("access()")
public void doBefore(JoinPoint joinPoint){
System.out.println(joinPoint.getSignature());
System.out.println("Before通知");
System.out.println("==============================");
}
@Around("@annotation(userAccess)")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint, UserAccess userAccess){
System.out.println("Around通知");
try {
return proceedingJoinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("==============================");
return null;
}
@After("access()")
public void doAfter(){
System.out.println("after通知");
System.out.println("==============================");
}
@AfterReturning("access()")
public void doAfterReturning(){
System.out.println("AfterReturning通知");
System.out.println("==============================");
}
@AfterThrowing("access()")
public void doAfterThrowing(){
System.out.println("AfterThrowing通知");
System.out.println("==============================");
}
}
查看控制台
可知执行顺序为下图