一、通知类型
@Around:环绕通知,此注解标注的通知方法在目标方法前、后都被执行
@Before:前置通知,此注解标注的通知方法在目标方法前被执行
@After:后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行
@AfterReturning:返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行
@AfterThrowing:异常后通知,此注解标注的通知方法发生异常后执行
二、注意事项
1、@Around环绕通知需要自己调用proceedingJoinPoint.proceed()来让原始方法执行,其他通知不需要考虑目标方法执行
2、@Around环绕通知方法的返回值,必须指定Object,来接收原始方法的返回值
三、抽取切入点表达式
@PointCut:将公共的切点表达式抽取出来,需要用到时引用该切点表达式即可
public class MyAspect1 {@Pointcut("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")public void pt(){}@Before("pt()")public void before(){log.info("before");
}
}
四、代码实现
@Before("pt()")public void before(){log.info("before");}
@Around("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {log.info("around before");//调用目标对象的原始方法执行Object result=proceedingJoinPoint.proceed();log.info("around after");return result;}
@After("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")public void after(){log.info("after");}
@AfterReturning("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")public void afterReturning(){log.info("afterReturning");}
@AfterThrowing("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")public void afterThrowing(){log.info("afterThrowing");}