【Spring AOP】什么是AOP

news2024/12/24 0:18:53

文章目录

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

1、AOP思想

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

回顾:
OOP(面向对象编程)
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,可以按照接口,也可以按照它的实现类:

在这里插入图片描述

切入点表达式标准格式:
---->
动作关键词(访问修饰符 返回值 包名.类/接口名 .方法名(参数)异常名)
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中类型:

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

代码实现:


各个类型的详解:

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

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



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

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

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

6、AOP通知获取数据

在这里插入图片描述

在这里插入图片描述

获取切入点方法的参数:

在这里插入图片描述

获取切入点方法返回值
  • 对于AfterReturning,我们使用形参来接收返回值:
    在这里插入图片描述
  • 对于Around,执行原始方法时,得到的结果即返回值:
    在这里插入图片描述
获取切入点方法异常信息
  • 对于Around,不再throw,直接try…catch即可:
    在这里插入图片描述
  • 对于AfterThrowing,使用新参接收异常对象:
    在这里插入图片描述

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

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

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

业务层接口和实现类:

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

数据层接口和实现类:

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

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

在这里插入图片描述

测试程序:

在这里插入图片描述

运行结果:

在这里插入图片描述

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

8、AOP总结

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/842881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8.18信号量Semaphore和CountDownLatch

一 .Semaphore: 1.Semaphore是一个计数器(变量),描述可用资源的个数,用来判断是否有临界资源可用. 2.临界资源:多个进程或线程并发执行的实体可以公共使用到的资源. 3.pv操作:p操作(accquire(申请))表示计数器减一,v操作(release(释放))表示计数器加一. 4.锁是特殊的信号量…

RISC-V公测平台发布:如何在SG2042上玩转OpenMPI

About HS-2 HS-2 RISC-V通用主板是澎峰科技与合作伙伴共同研发的一款专为开发者设计的标准mATX主板,它预装了澎峰科技为RISC-V高性能服务器定制开发的软件包,包括各种标准bencmark、支持V扩展的GCC编译器、计算库、中间件以及多种典型服务器应用程序。…

[webpack] 处理样式 (二)

文章目录 1.介绍2.处理 Css 资源2.1 导入包2.2 功能配置2.3 添加 Css 资源 3.处理 Less 资源3.1 导入包3.2 功能配置3.3 添加 Less 资源 4.处理 Sass 和 Scss 资源4.1 导入包4.2 配置4.3 添加 Sass 资源4.4 运行webpack 5.处理 Styl 资源5.1 导入包5.2 配置5.3 添加 Styl 资源5…

微信开发之自动同意好友的技术实现

简要描述: 同意添加好友 请求URL: http://域名地址/acceptUser 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明…

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑 现在想对一个接口做性能测试,需要测试它多个线程并发下的调用 1.新建测试计划和线程组 略 2.新建http接口 一个完整的http接口包含请求头和请求,这里就需要两个组件:HTTP request、HT…

c语言函数作为形参的注意事项

1、c语言数组作为形参会退化成数组指针 #include "stdio.h" #include <stdlib.h>//数组作为函数的形参会退化成指针 void print_arr(int a[5]);// int *b int main() {int arr[5] { 1,2,3,4,5 };print_arr(arr);return 0; }void print_arr(int a[5]) {printf…

SocialFi 的开发中如何利用 NFTScan API 获取 NFT 数据

SocialFi 作为社交媒体与 Web3 的创新融合&#xff0c;致力于构建更加开放去中心化的社交平台。它赋能用户拥有数据控制权、实现内容价值&#xff0c;并通过代币经济建立起激励与治理机制&#xff0c;这正是 Web3 社交的独特魅力所在。SocialFi 为我们描绘了一个更加用户驱动、…

从0开始全栈深度学习工程师之路(四):VSCode提效设置和插件

在从0开始深度学习工程师之路&#xff08;三&#xff09;&#xff1a;Python开发环境搭建&#xff08;VSCode) 中,我们一步步搭建了基于VSCode的开发环境&#xff0c;这一篇我们继续优化我们的开发环境&#xff0c;毕竟工欲善其事&#xff0c;必先利其器。 配置 同步设置 我…

GG修改器安装与Root环境的安装

关于GG修改器大家应该都有一定的了解吧&#xff0c;就是类似于电脑端CE的一个软件。 GG修改器在百度云盘里请自行下载&#xff01; 百度网盘链接&#xff1a;https://pan.baidu.com/s/1p3KJRg9oq4s0XzRuEIBH4Q 提取码&#xff1a;vuwj 那我要开始了&#xff01; 本来不想讲GG…

WMS仓储管理系统的价值从哪些方面体现

仓库管理在不断改善&#xff0c;采用信息化来管理仓库。自从使用了WMS仓储管理系统解决方案后&#xff0c;仓库管理的效率大大提高了&#xff0c;而且WMS系统有很多价值。 首先&#xff0c;WMS系统可以帮助员工更省时省力地完成仓库管理工作&#xff0c;提高效率和准确性。传统…

农业大数据可视化平台,让农业数据更直观展现!

农业大数据可视化平台是指利用大数据技术和可视化工具&#xff0c;对农业领域的数据进行收集、整理、分析和展示的平台。它可以帮助农业从业者更好地理解和利用农业数据&#xff0c;提高农业生产效率和决策水平。 农业大数据可视化平台通常具有以下特点和功能&#xff1a; 数据…

WorkTool企微机器人自动接收图片回传(方案三)

自动接收图片并上传到服务器&#xff0c;仅适用企业微信应用 前言 WorkTool企微机器人可以接收客户群的消息&#xff0c;但接收图片一直是个问题&#xff0c;前面也介绍过两种图片接收方案&#xff0c;但都会影响运行效率&#xff0c;并且不能达到100%的图片接收率&#xff0…

配置两台数据库为主从数据库模式

一、主库配置 1、修改配置文件 /etc/my3306.cnf #mysql服务ID&#xff0c;保证整个集群环境中唯一&#xff0c;默认为1server-id1#是否只读&#xff0c;1代表只读&#xff0c;0代表读写read-only0#忽略的数据&#xff0c;指不需要同步的数据库#binlog-ignore-dbmysql#指定同步…

Jmeter命令行运行实例讲解

1. 简介 使用非 GUI 模式&#xff0c;即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资 本文介绍windows下以命令行模式运行的方法。 1.1. 命令介绍 jmeter -n -t <testplan filename> -l <listener filename> 示例&#xff1a; jmeter -n -t test…

承泰科技Q3再获30多个智驾项目,新增订单0.86亿!累计近11亿!

中国毫米波雷达市场正处于高速发展期&#xff0c;以承泰科技为代表的本土供应商在前装量产赛道上展示出加速度。 高工智能汽车研究院预测&#xff0c;随着L2及L2持续处于市场增长的高速期&#xff0c;对应毫米波雷达上车量将在2023年实现30-50%的同比增速。 根据高工智能汽车…

Gpt微信小程序搭建的前后端流程 - 前端小程序部分-1.基础页面框架的静态设计(二)

Gpt微信小程序搭建的前后端流程 - 前端小程序部分-1.基础页面框架的静态设计(二) 在开始这个专栏&#xff0c;我们需要找一个小程序为参考&#xff0c;参考和仿照其界面&#xff0c;聊天交互模式。 这里参考小程序-小柠AI智能聊天&#xff0c;可自行先体验。 该小程序主要提供了…

轻量级容器管理工具 Containerd

1. 轻量级容器管理工具 Containerd 2. Containerd的两种安装方式 3. Containerd容器镜像管理 4. Containerd数据持久化和网络管理 1. 前言 早在2016年3月&#xff0c;Docker 1.11的Docker Engine里就包含了containerd&#xff0c;而现在则是把containerd从Docker Engine里彻底…

空地协同智能消防系统——无人机、小车协同

1 题目 1.1 任务 设计一个由四旋翼无人机及消防车构成的空地协同智能消防系统。无人机上安装垂直向下的激光笔&#xff0c;用于指示巡逻航迹。巡防区域为40dm48dm。无人机巡逻时可覆盖地面8dm宽度区域。以缩短完成全覆盖巡逻时间为原则&#xff0c;无人机按照规划航线巡逻。发…

8-7 homework

1.思维导图 2.写一个函数&#xff0c;获取用户的uid和gid并使用变量接收

快速降低javacv依赖包的大小

前言&#xff1a; 由于在项目中需要对视频进行缩略图的截图处理&#xff0c;引入了javacv-platform的包&#xff0c;但是打包后发现打出来的jar包非常的大 后面得知是因为javacv-platform会将所有平台的包集中起来处理&#xff0c;导致包特别的大 处理&#xff1a; 我们在项目…