Day13-06.AOP进阶-通知类型
1.通知类型:
1.@Around:环绕通知,此注解标注的通知方法在目标方法前、后都被执行。
2.@Before:前置通知,此注解标注的通知方法在目标方法前被执行。
3.@After:后置通知(最终通知),此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行。
4.@AfterReturning:返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行。
5.%AfterThrowing:异常后通知,此注解标注的通知方法发生异常后执行。
2.注意事项:
1.@Around环绕通知需要自己调用 ProceedingJoinPoint.proceed() 来让原始方法执行,其他通知不需要考虑目标方法执行
2.@Around环绕通知方法的返回值,必须指定为Object,来接收原始方法的返回值。
3.@PointCut注解:
1.该注解的作用是将公共的切点表达式抽取出来,需要用到时引用该切点表达式即可。
private:仅能在当前切面类中引用该表达式
public:在其他外部的切面类中也可以引用该表达式
@Slf4j
@Component
@Aspect
public class MyAspect {
@Pointcut("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
public void pt(){}
@Before("pt()")
public void before(){
log.info("before...");
}
@Around("pt()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
log.info("around before...");
//调用原始方法执行
Object result = proceedingJoinPoint.proceed();
log.info("around after...");
return result;
}
@After("pt()")
public void After(){
log.info("After...");
}
@AfterReturning("pt()")
public void AfterReturning(){
log.info("AfterReturning...");
}
@AfterThrowing("pt()")
public void AfterThrowing(){
log.info("AfterThrowing...");
}
}s
其他类引用切入点表达式:
@Slf4j
@Component
@Aspect//AOP类
public class TimeAspect {
@Around("com.itheima.aop.MyAspect.pt()")//切入点表达式
public Object recordTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//1.记录开始时间
long begin = System.currentTimeMillis();
//2.调用原始方法
Object result = proceedingJoinPoint.proceed();//原始方法执行返回值
//3.记录结束时间
long end = System.currentTimeMillis();
log.info(proceedingJoinPoint.getSignature() + "方法执行时间为:{}", end - begin + "ms");
return result;
}
}
4.小结:
1.通知类型
@Before(前置通知)
@After(后置通知)
@Around(环绕通知,重点)
@AfterReturning(返回后通知,了解)
@AfterThrowing(异常后通知,了解)