第二部分:AOP

一、AOP简介

AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构。

AOP是OOP(面向对象编程)的进阶版。

作用:在不改变原始设计的基础上为其进行功能增强。

spring理念:无侵入式。

 二、AOP入门实例

1、pom.xml导入坐标:注解开发(spring-context)、切面编程(aspectjweaver)

2、配置类SpringConfig 内添加注解@EnableAspectJAutoProxy                                                   (开启spring对AOP注解驱动支持)表示要注解开发AOP

3、通知类MyAdvice:定义通知(功能)、定义切入点(位置)定义切面(绑定通知和切入点)

@Component //定义通知类受spring容器管理(让spring加载此通知类)
@Aspect //定义当前类为切面类(让spring明白此类 是做AOP的)//在此类定义通知(共性功能)
public class MyAdvice {//定义切入点(本质上就是确定要加功能的方法的准确位置)(// 依托一个不具有实际意义的方法进行,即无参无返回值,方法体无实际逻辑)@Pointcut("execution(void com.itheima.dao.BookDao.update())")private void pt(){}//将切入点(位置)和通知(功能)绑定@Before("pt()")//定义通知(本质就是要添加的功能)public void method(){System.out.println(System.currentTimeMillis());}
}

三、AOP工作流程

springAOP本质:代理模式           

如果切入点能和我要造bean的那个类匹配上对应的方法,则造代理对象;否则造原始对象

打印对象的getClass()方法(如bookDao.getClass())就可以看见是代理对象还是原始对象

四、AOP切入点表达式

切入点定位到接口 & 实现类均可(但是写到实现类就紧耦合了,所以不写)

@Pointcut("execution(void com.itheima.BookDao.updata())")
@Pointcut("execution(void com.itheima.dao.impl.BookDaoImpl.updata())")

1、语法格式:

 2、通配符

 3、书写技巧

 五、AOP通知类型<5>

<AOP通知描述了要添加的共性功能,共性功能要添加到切入点的合适位置。>                                AOP通知共分为5种类型:

前置通知、后置通知、环绕通知(重点)、返回后通知(了解)、抛出异常后通知(了解)

注意:环绕通知对原始方法调用以后,原始方法的返回值可以接出来,最终还要手动给送回去。下文中环绕通知即为规范格式。

@Component //定义通知类受spring容器管理(让spring加载此通知类)
@Aspect //定义当前类为切面类(让spring明白此类 是做AOP的)//在此类定义通知(共性功能)
public class MyAdvice {//定义切入点(本质上就是确定要加功能的方法的准确位置)(// 依托一个不具有实际意义的方法进行,即无参无返回值,方法体无实际逻辑)@Pointcut("execution(void com.itheima.dao.BookDao.update())")public void pt1(){}@Pointcut("execution(int com.itheima.dao.BookDao.select())")public void pt2(){}//将切入点(位置)和通知(功能)绑定@Before("pt1()")//前置通知public void before(){System.out.println("此处是增强添加的通知,并且是一个前置通知");}@After("pt1()")//后置通知public void after(){System.out.println("此处是增强添加的通知,并且是一个后置通知");}@Around("pt1()")//环绕通知public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("此处是增强添加的通知,并且是一个环绕通知");Object ret = pjp.proceed();System.out.println("此处是增强添加的通知,并且是一个环绕通知");return ret;}剩下俩个为:
@AfterReturning("")
@AfterThrowing("")

 此处可以利用around对原始方法进行《隔离》!

六、万次执行效率测试

测试业务层:

切入点表达式要确定业务层

@Pointcut("execution(* com.itheima.dao.*.*())")public void pt1(){}

采用环绕通知获取执行万次的前后系统时间

 @Around("pt1()")public void method(ProceedingJoinPoint pjp) throws Throwable {//获取执行签名信息Signature signature = pjp.getSignature();//通过签名获取接口名String className = signature.getDeclaringTypeName();//通过签名获取方法名String methodName = signature.getName();long start = (int) System.currentTimeMillis();for(int i = 0; i < 10000;i++){pjp.proceed();//此处代表执行业务层一万次}long end = (int) System.currentTimeMillis();System.out.println("执行一万次" + className + "." + methodName +"--->" + (end - start) + "ms");}

七、AOP通知获取数据

AOP是对原始方法进行增强的,必然要知道原始方法的数据。

基本操作:在通知的方法的参数内加上接口,调用接口的方法来获取原始方法的参数。

获取的数据有三类:原始操作的参数、原始操作的返回值、原始操作的异常。

每种类型的数据只有五类通知的部分可以获取:

1、获取参数

获取的参数类型为数组;对于前置通知获取参数后,可以对数据检验错误、修改等操作。

 //将切入点(位置)和通知(功能)绑定//@Before("pt1()")//前置通知public void before(JoinPoint jp){System.out.println("此处是增强添加的通知,并且是一个前置通知");Object[] args = jp.getArgs();//此方法getargs获取参数是数组类型System.out.println(Arrays.toString(args));}
后置、环绕、、都一样。

2、获取返回值

@Around("pt1()")//环绕通知
public Object around(ProceedingJoinPoint pjp) throws Throwable {Object args[] = pjp.getArgs();return ret;

3、获取异常信息

    @AfterThrowing(value = "pt1",throwing = "t")public void afterThrowing(Throwable t){System.out.println("返回异常" + t);}//注意通知的方法的参数要和标签的参数一致

八、百度网盘粘贴:字符串匹配自动处理多余的空格

AOP增强

@Component
@Aspect
public class DataAdvice {//定义切入点@Pointcut("execution(boolean com.itheima.service.ResourcesService.openURL(..))")public void pt(){}@Around("pt()")public Object trimStr(ProceedingJoinPoint pjp) throws  Throwable{//提前获取参数 将参数修改后在传参给原始方法内Object args[] = pjp.getArgs();for (int i = 0; i < args.length; i++) {if(args[i].getClass().equals(String.class)){//判断是不是字符串类型args[i] = args[i].toString().trim(); //是字符串类型就trim}}Object ret = pjp.proceed(args);//将空格处理后的参数在传参给要执行的原始方法return ret;}
}

十一、AOP总结

回忆。

要会啥呢?

1、得知道pom.xml文件里面要配置spring-context依赖(spring注解开发)、aspectjweaver依赖(AOP注解和切入点表达式,AOP核心功能已经被加载到spring-context依赖了)

2、知道要在spring核心配置类中加载AOP

3、得知道在AOP配置类中加载扫描啥的 切入点表达式会写。@Pointcut(“”execution())

4、环绕通知@Around(“”)参数ProceedingJoinpoint pjp

要写固定的执行原始方法得到返回值Object ret = pjp.proceed(args); return ret;

以上这些都是固定的。

5、根据不同的需要,通知类里面的方法咋写就看自己的了。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式Linux驱动开发系列五:Linux系统和HelloWorld

三个问题 了解Hello World程序的执行过程有什么用? 编译和执行&#xff1a;Hello World程序的执行分为两个主要步骤&#xff1a;编译和执行。编译器将源代码转换为可执行文件&#xff0c;然后计算机执行该文件并输出相应的结果。了解这个过程可以帮助我们理解如何将代码转化…

TIOBE2023年8月榜单发布,Python超越老将C/C++蝉联冠军

TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标&#xff0c;评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎&#xff0c;TIOBE 官网近日公布了 2023 年 8 月的编程语言排行榜。 此次的榜单中&#xff0c;Python依旧稳居第一&#xff0c;占比达到了13.33%。…

【BASH】回顾与知识点梳理(二十三)

【BASH】回顾与知识点梳理 二十三 二十三. Linux 账号管理&#xff08;二&#xff09;23.1 账号管理新增与移除使用者&#xff1a; useradd, 相关配置文件, passwd, usermod, userdelusermoduserdel 23.2 用户功能&#xff08;普通用户可使用&#xff09;idfingerchfnchsh 23.3…

【2023年11月第四版教材】《第4章-信息系统管理(合集篇)》

第4章-信息系统管理之管理方法&#xff08;第四版新增章节&#xff09;&#xff08;第一部分&#xff09; 章节说明1 管理方法1.1 信息系统四个要素1.2 信息系统四大领域1.3 信息系统战略三角1.4 信息系统架构转换1.5 信息系统体系架构1.6 信息系统运行1.7 运行和监控1.8 管理和…

Tomcat日志中文乱码

修改安装目录下的日志配置 D:\ProgramFiles\apache-tomcat-9.0.78\conf\logging.properties java.util.logging.ConsoleHandler.encoding GBK

【Windows 11】安装 Android子系统 和 Linux子系统

本文使用电脑系统&#xff1a; 文章目录 一、安卓子系统1.1 安装 WSA1.2 使用 二、Linux子系统2.1 安装 WSL 以及WSL 相关概念2.2 安装一个Linux发行版2.21 从Microsoft Store 安装2.22 用命令安装 2.23 拓展 三、拓展3.1 存储位置3.2 虚拟化技术3.3 Windows 虚拟内存3.3 wsl …

02:STM32--EXTI外部中断

目录 一:中断 1:简历 2:AFIO 3:EXTI ​编辑 4:NVIC基本结构 5:使用步骤 二:中断的应用 A:对外式红外传感计数器 1:连接图​编辑 2:函数介绍 3:硬件介绍 4:计数代码 B;旋转编码计数器 1:连接图 2:硬件介绍 3:旋转编码器代码: 一:中断 1:简历 中断&#xff1a;在主程…

三、性能测试场景设计

性能测试场景设计 一、引言&#xff1a;如果公司要求你去做性能测试&#xff0c;遇到这些场景&#xff0c;我们要如何设计&#xff1f;二、6种常见设计方法1、普通性能场景设计2、负载测试性能场景 一、引言&#xff1a;如果公司要求你去做性能测试&#xff0c;遇到这些场景&am…

用 oneAPI 实现 AI 欺诈检测:一款智能图像识别工具

简介 虚假图像和视频日益成为社交媒体、新闻报道以及在线内容中的一大隐患。在这个信息爆炸的时代&#xff0c;如何准确地识别和应对这些虚假内容已经成为一个迫切的问题。为了帮助用户更好地辨别虚假内容&#xff0c;我开发了一款基于 oneAPI、TensorFlow 和 Neural Compress…

生活中那些六 “有” 的人

1、有承诺 一些事情开始的时候总会有些协议与约定&#xff0c;我们称其为承诺&#xff1b;我们必须遵守承诺&#xff0c;即使是约会也要遵守&#xff0c;也不能迟到&#xff1b;迟到这件事不但会妨碍我们所有人&#xff0c;还意味着迟到者不尊重大家的时间。这种约定从某种意义…

python3装饰器理解与实战

前言 装饰器本质上是一个Python函数&#xff0c;它可以让其他函数在不需要做任务代码变动的前提下增加额外功能&#xff0c;装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景&#xff0c;比如&#xff1a;插入日志、性能测试、事务处理、缓存、权限校验等场景。装…

CVPR 2023 | 用户可控的条件图像到视频生成方法(基于Diffusion)

注1:本文系“计算机视觉/三维重建论文速递”系列之一&#xff0c;致力于简洁清晰完整地介绍、解读计算机视觉&#xff0c;特别是三维重建领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, NeurIPS, ICLR, ICML, TPAMI, IJCV 等)。 本次介绍的论…