AOP进阶

黑马程序员JavaWeb开发教程

一、通知类型

1.1 通知类型

  1. @Around:环绕通知,此注解标注的通知方法在目标方法前、后都被执行(重点)
  2. @Before:前置通知,此注解标注的通知方法在目标方法前被执行
  3. @After:后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行
  4. @AfterReturning:返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行(了解)
  5. @AfterThrowing:异常后通知,此注解标注的通知方法发生异常后执行(了解)

1.2 注意事项

  • @Around 环绕通知需要自己调用ProceedingJoinPoint.proceed() 来让原始方法执行,其他通知不需要考虑目标方法执行
  • @Around 环绕通知方法的返回值,必须指定为Object,来接收原始方法的返回值。

1.3 @PointCut

  • 该注解的作用是将公共的切点表达式抽取出来,需要用到时引用该切点表达式即可在这里插入图片描述
    在这里插入图片描述

  • 注意pt 方法的修饰符

    • private:仅能在当前切面类中引用该表达式
    • public:在其他外部的切面类中也可以引用该表达式

二、通知顺序

  • 昂有多个切面的切入点都匹配到了目标方法,䯮方法运行时,多个通知方法都会执行。

2.1 执行顺序

  1. 不同些面类中,默认按照切面类的类名字母排序
    • 目标方法前的通知方法:字母排名靠前的先执行
    • 目标方法后的通知方法:字母排名靠前的后执行
  2. 用 @Order(数字) 架子啊切面类上来控制顺序
    • 目标方法前的通知方法:数字小的先执行
    • 目标方法后的通知方法:数字小的后执行
      在这里插入图片描述

三、切入点表达式

3.1 切入点表达式

  1. 描述切入点方法的一种表达式
  2. 作用:主要用来决定项目中的哪些方法需要加入通知
  3. 常见形式
    • execution(…):根据方法的签名来匹配
      在这里插入图片描述

    • @annotation(…):根据注解匹配
      在这里插入图片描述

3.2 切入点表达式-execution

  1. execution 主要根据方法的返回值、报名、类名、方法名、方法参数等信息来匹配,语法为:execution(访问修饰符 返回值 包名.类名.方法名(方法参数) throws 异常)
    • 访问修饰符:可以省略
    • 包名、类名:可以省略
    • throws 异常:可以省略(注意是方法上声明抛出的异常,不是实际抛出的异常)
  2. 可以使用通配符描述切入点
    • *: 单个独立的任意符号,可以统配任意返回值、报名、类名、方法名、任意类型的一个参数,也可以统配包、类、方法名的一部分execution(* com.*.service.*.update*(*))
    • . . :多个连续的任意符号,可以统配任意层级的包,或任意类型、任意个数的参数execution(* com.itheima.DeptService.*(..))
  3. 书写建议
    • 素有业务方法名在命名是尽量规范,方便切入点表打死快速匹配。如:查询类方法以 find 开头,更新类方法以 update 开头
    • 描述切入点方法,通常基于接口描述,而不是直接描述实现类,增强拓展性
    • 在满足业务需要的前提下,尽量缩小切入点的匹配范围

3.2 切入点表达式- @annotation

  1. @annotation 切入点表达式,用于匹配标识有特定注解的方法@annotation(com.itheima.anno.Log)
    在这里插入图片描述

  2. 首先自己定义一个注解
    在这里插入图片描述
    在这里插入图片描述

  3. 想匹配哪个方法就在哪个方法上边加上自己定义的注解
    在这里插入图片描述

四、连接点

4.1 连接点

  • 在Spring 中用 JoinPoint 抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等。
    • 对于@Around 通知,获取连接点信息只能使用 ProceedingJoinPoint
    • 对于其他四种通知,获取连接点信息只能使用 JoinPoint,它是ProceedingJoinPoint 的父类型
      在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值