【Spring AOP】什么是AOP

待我称王封你为后i 2023-10-14 11:28 172阅读 0赞

文章目录

  • 1、AOP思想
  • 2、AOP入门案例
  • 3、AOP工作流程
  • 4、AOP切入点表达式
  • 5、AOP的五种通知类型
  • 6、AOP通知获取数据
  • 7、案例:百度网盘密码数据兼容处理
  • 8、AOP总结

1、AOP思想

AOP,即Aspect Oriented Programming,面向切面编程。是一种编程范式,指导开发者如何组织程序结构。在不惊动原始设计的基础上为其进行功能增强,实现无侵入式编程。

  1. 回顾:
  2. OOP(面向对象编程)
  3. Object Oriented Programming


AOP思想举例:

如下图右侧,我有增删改查四个方法,我想让它们的方法体被执行10000次,并计算耗时,但不能改变现有的程序。想实现这个效果,考虑定义一个共性方法(即左边的通知类里的method),并将待增强的方法(右)和共性方法做一个切面关联。

在这里插入图片描述
核心概念:

在这里插入图片描述

题外话:每用到AOP,脑子里就想到了小学改作文的加字符,不用擦掉原有的(不改现有代码),直接加。

在这里插入图片描述

2、AOP入门案例

思路分析:

  • 导入坐标(pom.xml)
  • 制作连接点方法(即待增强的代码)
  • 制作共性功能(通知类与通知)
  • 定义切入点
  • 绑定切入点与通知关系

步骤1:导入切面相关依赖坐标(pom.xml)
在这里插入图片描述

步骤2:随便写个连接点方法(这里是你要做增强的方法)

在这里插入图片描述

步骤3:制作共性功能(通知类与通知)

在这里插入图片描述

步骤4:在通知类中定义切入点

在这里插入图片描述

切入点的定义需要依托一个不具有实际意义的方法进行,如上面的pt()方法,它无参数、无返回值、方法体无实际逻辑。其中:@Pointcut注解来定义切入点

步骤5:绑定切入点与通知的关系,并指定通知添加到原始连接点具体执行位置
在这里插入图片描述

注意,需要用注解@Component定义通知类受Spring容器管理,再加注解@Aspect定义当前类为切面类,最后在Spring核心配置类中使用注解@EnableAspectJAutoProxy开启对AOP注解驱动支持

在这里插入图片描述

至此,在未改动原程序的基础上,update方法新增了功能–打印当前时间:

在这里插入图片描述

3、AOP工作流程

在这里插入图片描述
注意,若bean对应的类中的方法没有匹配到任意切入点,则创建出来的bean就是普通对象,无关AOP,也无关代理对象。

在这里插入图片描述
打印bean,由于toString被重写,看不出来区别,调用getClass方法,可以看到代理类class是com.sun.proxy.$Proxy19,整个AOP的实现就是使用了代理模式。

4、AOP切入点表达式

切入点表达式语法:

  • 切入点:需要进行增强的那个方法,如上面的update
  • 切入点表达式:即要进行增强的这个方法,怎么去描述它

比如描述要增强的update,可以按照接口,也可以按照它的实现类:

在这里插入图片描述

  1. 切入点表达式标准格式:
  2. ---->
  3. 动作关键词(访问修饰符 返回值 包名.类/接口名 .方法名(参数)异常名)
  4. execution(public User com.llg.service.Uservice.findById(int))
  • 动作关键字:描述切入点的行为动作,execution即执行到指定切入点
  • 方法修饰符:public、private等可以省略
  • 返回值
  • 包名
  • 类/接口名
  • 参数
  • 异常名:方法定义中抛出指定异常,可以省略

通配符

使用通配符来描述切入点,提高效率:

  • *:单个独立的任意符号,可以独立出现,也可做为前缀或后缀匹配符。

    execution(public com.llg..UserService.find ())

匹配com.llg包下得任意包中得UserService类或接口中所有find开头得带有一个参数(注意不是无参数)、返回类型任意的public方法

  • . .:多个连续的任意符号,可独立出现,常用于简化包名与参数的书写

    execution(public User com..UserService.findById(..))

匹配com包下的任意包中的UserService类或接口中所有名称为findById的方法

  • +:专门用于匹配子类类型

    execution( ..Service+.(..))

切入点表达式的书写技巧:

在这里插入图片描述

5、AOP的五种通知类型

AOP通知描述了抽取的共性功能,根据共性功能抽取的位置的不同,最终代码运行时要将其加入到合理的位置中,(说白了就是共性功能和待增强的原代码怎么个执行顺序)这个位置,有5中类型:

  • 前置通知
  • 后置通知
  • 环绕通知
  • 返回后通知
  • 抛出异常后通知

代码实现:


  1. 各个类型的详解:

@Before:
在这里插入图片描述
@After
在这里插入图片描述
@Around
在这里插入图片描述
注意:pjp.proceed()是对原始操作的调用,这样就区分出来了环绕具体是怎么个执行顺序,当原始操作有返回值的时候,这里要改为Object类型,并接收proceed方法的返回值来return。(原始操作返回void,也可以使用Object类型,这时候返回的是null而已)

在这里插入图片描述
@AfterReturning
在这里插入图片描述
@AfterThrowing
在这里插入图片描述



  1. 案例--测量业务层接口万次执行效率

计算时间差即执行时长,需要在接口执行前后分别记录时间==>环绕通知
在这里插入图片描述
使用环绕通知,先实现执行时长:
在这里插入图片描述

通过执行签名信息,来获取所测的接口名和方法名:
在这里插入图片描述

6、AOP通知获取数据

在这里插入图片描述

在这里插入图片描述

  1. 获取切入点方法的参数:

在这里插入图片描述

  1. 获取切入点方法返回值
  • 对于AfterReturning,我们使用形参来接收返回值:
    在这里插入图片描述
  • 对于Around,执行原始方法时,得到的结果即返回值:
    在这里插入图片描述

    获取切入点方法异常信息

  • 对于Around,不再throw,直接try…catch即可:
    在这里插入图片描述

  • 对于AfterThrowing,使用新参接收异常对象:
    在这里插入图片描述

7、案例:百度网盘密码数据兼容处理

实现核心:使用环绕通知对原始操作的参数进行修改!

在这里插入图片描述
代码实现:

  1. 业务层接口和实现类:

在这里插入图片描述在这里插入图片描述

数据层接口和实现类:

在这里插入图片描述
在这里插入图片描述

使用AOP思想,为业务层方法,加上去空格的功能,提高兼容性和用户使用体验:

在这里插入图片描述

测试程序:

在这里插入图片描述

运行结果:

在这里插入图片描述

====================

8、AOP总结

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,172人围观)

还没有评论,来说两句吧...

相关阅读

    相关 什么SpringAOP?

    AOP:是面向切面编程,是一种思想,对某一类事情的集中处理举个例子例子来说明:例如你访问一个网站(可以登录的那种),登录后服务器这边是判定你登录状态的,进入每个页面也都会判定一

    相关 什么AOP

    一、AOP基本概念 1、什么是AOP AOP(Aspect Oriented Programing)面向切面编程,一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构

    相关 Spring AOP什么

    面向切面编程(AOP)和面向对象编程(OOP)类似,也是一种编程模式。Spring AOP 是基于 AOP 编程模式的一个框架,它的使用有效减少了系统间的重复代码,达到了模块间

    相关 什么SpringAOP特性?

    我工作遇到的第一个问题就是用 Spring AOP 解决的。Spring AOP 真正用起来的时候很少,但是无一不是解决重要问题。用一种轻松的手法解决了重要的问题,Spring