- AOP通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理位置
- AOP通知共分为5种类型
1、前置通知(掌握)
2、后置通知(掌握)
3、环绕通知(重点)
- @Around主要事项(环绕通知)
1、环绕通知必须依赖形参ProceedingJoinPoint才能实现对原始方法的调用,进而实现原始方法调用前后同时添加通知
2、通知中如果未使用ProceedingJoinPoint对原始对象进行调用将跳过原始方法的执行
3、对原始方法的调用可以不接受返回值,通知方法设置为void即可,如果接受返回值,必须设置为Object类型
4、原始方法的返回值结果如果是void类型,通知方法的返回值类型可以设置为void也可以设置为Object
5、由于无法预知原始方法运行是否会抛出异常,因此环绕通知必须抛出Throwable对象
4、返回后通知(了解)
5、抛出异常后通知(了解)
代码演示
package com.itheima.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Component //定义通知受spring管理
@Aspect //定义当前类为切面类
public class Aop {
@Pointcut("execution(void com.itheima.service.UserService.upDataById())")//定义切入点 参数表示方法是com.itheima.service.UserService.upDataById() 无返回值
public void pt(){}//说明切入点依托一个不具有实际意义的方法,即无参数,无返回值,方法体无逻辑
@Before("pt()")//绑定切入点与通知关系,并指定添加到原始连接的具体执行位置 before表示当前通知在原始切入点前执行
public void before(){
System.out.println(System.currentTimeMillis());//通知
}
@After("pt()") //After表示当前通知在原始切入点后执行
public void after(){
System.out.println(System.currentTimeMillis());
}
@Around("pt()") //Around表示当前通知在原始切入点环绕执行
public Object around(ProceedingJoinPoint pjp) throws Throwable { //若有返回值 返回值类型定义为Object
System.out.println("前");
Object proceed = pjp.proceed(); //ProceedingJoinPoint对象.proceed调用原始切入点 区分前后执行的代码
System.out.println("后");
return proceed; //若有返回值将调用原始切入点的结果返回
}
@AfterReturning("pt()") //AfterReturning表示当前通知在原始切入点正常执行完成后执行,如果原始切入点报错或抛出异常则通知不执行
public void AfterReturning(){
System.out.println(System.currentTimeMillis());
}
@AfterThrowing("pt()") //AfterThrowing表示当前通知在原始切入点抛出异常或报错时执行,如果原始切入点正常执行则通知不执行
public void AfterThrowing(){
System.out.println(System.currentTimeMillis());
}
}