什么是AOP

news2024/9/24 11:33:03

文章目录

  • 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/823070.html

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

相关文章

记一次centos 磁盘挂载过程

前言 最近买了云服务器磁盘,需要挂载,一下就由大猿来记录这次过程。 挂载过程 查看磁盘挂载情况 查看物理硬盘 lsblkfdisk -l标记分区 fdisk /dev/vdb格式化分区 xfs mkfs.xfs /dev/vdb mkfs.xfs -f /dev/vdbext4 mkfs.ext4 /dev/vdbxfs 和 ex…

[代码案例] pytorch快速上手写机器学习

任务背景 给定未来一段时间的温度,使用神经网络预测输出是天气炎热,温暖,凉爽,偏冷,寒冷 输入是未来 20天内的气温数据,输出标签是 0,1,2,3,4 代码 """Author : 琛歌很无聊Description: …

wordpress 学习贴

安装问题 我的使用环境为docker环境,php、nginx、mysql分别处于3个容器中, 提示异常,打开debug模式,会发现 No such file or directory Warning: mysqli_real_connect(): (HY000/2002): No such file or directory 这个其实问题其…

ConcurrentHashMap底层具体实现以及实现原理

问题描述 ConcurrentHashMap 底层具体实现以及实现原理 分析维度: 1. ConcurrentHashMap的整体架构 2. ConcurrentHashMap的基本功能 3. ConcurrentHashMap在性能方面的优化 解决方案: ConcurrentHashMap 的整体架构 如图所示,这个是 Concu…

int[]数组转Integer[]、List、Map「结合leetcode:第414题 第三大的数、第169题 多数元素 介绍」

文章目录 1、int[ ] 转 Integer[ ]:2、两道leetcode题遇到的场景:2.1、int[ ] 转 List<Integer> :2.2、int[ ] 转 Map: 1、int[ ] 转 Integer[ ]: public static void main(String[] args) {int[] nums {1, 2, 3}; Integer[] array Arrays.stream(nums).boxed().to…

Java反射(一)

目录 1.了解反射 2.Class类的三种实例化方法 3.反射机制与对象实例化 4.反射与单例设计模式 5.通过反射获取类结构的信息 1.了解反射 什么是反射&#xff0c;反射有什么作用 1.在Java中&#xff0c;反射是一种机制&#xff0c;允许程序在运行时动态地获取、使用和修改类的…

ASL芯片CS5261 替代瑞昱RTD2171替代AG9310芯片 Type-C转HDMI音频单转 CS5261搭配VL171母座正反插原理图性价比方案

在2021年末尾&#xff0c;瑞昱RTD2171已经停产&#xff0c;ASL集睿致远的单转Type-C转HDMI方案芯片&#xff0c;ASL集睿致远 CS5261却可以完 全替代兼容RTD2171和AG9310, CS5261芯片还可以实现对Type-C接口信号转换的同时实现投屏的慢充功能。另外如果使用芯片CS5261VL171支持T…

Nodejs 第四章(Npm install 原理)

在执行npm install 的时候发生了什么&#xff1f; 首先安装的依赖都会存放在根目录的node_modules,默认采用扁平化的方式安装&#xff0c;并且排序规则.bin第一个然后系列&#xff0c;再然后按照首字母排序abcd等&#xff0c;并且使用的算法是广度优先遍历&#xff0c;在遍历依…

【Python】Web学习笔记_flask(3)——上传文件

用GET、POST请求上传图片并呈现出来 首先还是创建文件上传的模板 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>上传图片</title> </head> <body> <form action""…

XGBoost的参数

目录 1. 迭代过程 1.1 迭代次数/学习率/初始&#x1d43b;最大迭代值 1.1.1 参数num_boost_round & 参数eta 1.1.2 参数base_score 1.1.3 参数max_delta_step 1.2 xgboost的目标函数 1.2.1 gamma对模型的影响 1.2.2 lambda对模型的影响 2. XGBoost的弱评估器 2.…

android app控制ros机器人四(调整界面布局)

半吊子改安卓&#xff0c;记录页面布局调整&#xff1a; 在ros-mobile基础上顶端增加一行&#xff0c;用于显示app名称和logo图像&#xff1b;修改标签页。 添加文字简单&#xff0c;但是替换图标长知识了&#xff0c;开始只是简单的把mipmap各个文件夹下的图片进行替换&…

Web-7-深入理解Cookie与Session:实现用户跟踪和数据存储

深入理解Cookie与Session&#xff1a;实现用户跟踪和数据存储 今日目标 1.掌握客户端会话跟踪技术Cookie 2.掌握服务端会话跟踪技术Sesssion 1.会话跟踪技术介绍 会话&#xff1a;用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断…

Spring boot开发实用篇

一、热部署 1.启动热部署 1.导入坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId> </dependency> 2.使用构建项目操作启动热部署 3.关于热部署 重启&#xff1a;自定义开发…

【软件测试学习】—软件测试的基本认识(一)

【软件测试学习】—软件测试的基本认识&#xff08;一&#xff09; 文章目录 【软件测试学习】—软件测试的基本认识&#xff08;一&#xff09;一、什么是软件测试二、软件测试的目的三、测试的原则四、测试的标准五、测试的基本要求六、bug的由来七、测试的流程八、开发模式九…

消息中间件应用场景介绍

提高系统性能首先考虑的是数据库的优化&#xff0c;但是数据库因为历史原因&#xff0c;横向扩展是一件非常复杂的工程&#xff0c;所有我们一般会尽量把流量都挡在数据库之前。 不管是无限的横向扩展服务器&#xff0c;还是纵向阻隔到达数据库的流量&#xff0c;都是这个思路。…

Web后端基本设计思想

JavaWeb应用的后端一般基于MVC和三层架构思想实现。 MVC是一种设计模式&#xff0c;用于开发用户界面和交互式应用程序。M即Model&#xff0c;业务模型&#xff0c;负责处理应用程序的业务逻辑和数据&#xff1b;V即View&#xff0c;视图&#xff0c;负责给用户展示界面和数据&…

【Web】web

dns与域名 网络是基于tcp/ip协议进行通信和连接的 应用层——传输层——网络层——数据链路层——物理层 每一定的台主机都有一个唯一且固定的地址标识——IP地址 IP地址的做用&#xff1a;1.区分用户和计算机&#xff1b;2.进行通信 IP地址由32位二进制数组成&#xff0c;…

<C++> 引用

1.引用的概念 引用&#xff08;Reference&#xff09;是一种别名&#xff0c;用于给变量或对象起另一个名称。引用可以理解为已经存在的变量或对象的别名&#xff0c;通过引用可以访问到原始变量或对象的内容。引用在声明时使用 & 符号来定义。 示例&#xff1a; #inclu…

小程序如何从分类中移除商品

​有时候商家可能需要在商品分类中删除某些商品&#xff0c;无论是因为商品已下架、库存不足还是其他原因。在这篇文章中&#xff0c;我们将介绍如何从分类中移除商品。 方式一&#xff1a;分类管理中删除商品。 进入小程序管理后台&#xff0c;找到分类管理&#xff0c;在分…

记录一次通过iostat命令定位系统数据库CPU飙升的案例

一、背景 我们有个移动考勤的系统&#xff0c;运维监控系统显示&#xff0c;每到上下班时间&#xff0c;考勤数据库的CPU就飙升到100%&#xff0c;磁盘读写请求等待时间变长&#xff0c;最初无法确定是磁盘性能下降导致的CPU飙升&#xff0c;还是CPU飙升导致的磁盘性能下降&…