Spring - AOP通知类型

386 阅读2分钟
  • AOP通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理位置
  • AOP通知共分为5种类型

1、前置通知(掌握) image.png

2、后置通知(掌握) image.png

3、环绕通知(重点) image.png

  • @Around主要事项(环绕通知)

1、环绕通知必须依赖形参ProceedingJoinPoint才能实现对原始方法的调用,进而实现原始方法调用前后同时添加通知

2、通知中如果未使用ProceedingJoinPoint对原始对象进行调用将跳过原始方法的执行

3、对原始方法的调用可以不接受返回值,通知方法设置为void即可,如果接受返回值,必须设置为Object类型

4、原始方法的返回值结果如果是void类型,通知方法的返回值类型可以设置为void也可以设置为Object

5、由于无法预知原始方法运行是否会抛出异常,因此环绕通知必须抛出Throwable对象

image.png

4、返回后通知(了解)

image.png

5、抛出异常后通知(了解)

image.png

代码演示

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());
    }
}