一、Spring的AOP分为以下5种类型通知
①前置通知(Before):在连接点执行前执行该通知
②正常返回通知(AfterReturning):在连接点正常执行完后执行该通知,若目标方法执行异常则不会执行该通知
③异常返回通知(AfterThrowing):在连接点执行抛出异常时执行该通知
④后置通知(after/finally):在连接点执行完成后(不管成功、失败、异常)都会执行该通知
⑤环绕通知(Around):围绕在连接点前后
二、执行顺序
1、正常执行
①环绕通知:@Around
②前置通知:@Before
③连接点方法执行
④环绕通知:@Around
⑤后置通知:@After
⑥正常返回通知:@AfterReturning
其他结论说出来也没意思,还是自己通过简单demo测试一下就出来了
三、测试
1、自定义注解
2、切面
@Aspect @Component @Slf4j public class LogAspect { //切点范围 @Pointcut("@annotation(com.test.annotation.OperateLog)") public void operateMethod(){} //前置通知 @Before("operateMethod()") public void before(){ log.info("前置通知:Before"); } //正常返回通知 @AfterReturning("operateMethod()") public void afterReturning(){ log.info("后置通知:AfterReturning"); } //后置通知 @After("operateMethod()") public void after(){ log.info("后置通知:After"); } //异常返回通知 @AfterThrowing("operateMethod()") public void afterThrowing(){ log.info("异常返回通知:AfterThrowing"); } //环绕通知 @Around("operateMethod()") public Object methodAround(ProceedingJoinPoint joinPoint) throws Throwable{ log.info("环绕通知:around------前"); Object result=null; OperateLog annotation = getAnnotation(joinPoint); try { result=joinPoint.proceed(); } catch (Throwable throwable) { log.info("环绕通知:around------异常"); } try { String system = annotation.system(); int flag = annotation.flag(); String operatorName = annotation.operatorName(); log.info("切面校验信息,系统:【{}】,标识:【{}】,操作员名称:【{}】", system,flag,operatorName); //日志入库业务 } catch (Exception e) { log.info("切面异常",e); } log.info("环绕通知:around------后"); return result; } private OperateLog getAnnotation(JoinPoint joinPoint){ MethodSignature signature = (MethodSignature)joinPoint.getSignature(); Method method = signature.getMethod(); return method.getAnnotation(OperateLog.class); } }