AOP通知获取数据

news2024/11/15 11:09:36

之前说到了AOP可以对原始方法进行增强,那么AOP是否可以获取到原始方法的数据并对原始方法的数据利用增强方法进行处理呢?我们将从获取参数、获取返回值和获取异常三个方面来研究。
首先,我们可以知道,所有的通知类型都可以获取参数:
JoinPoint:适用于前置、后置、返回后、抛出异常后通知。
ProceedingJoinPoint:适用于环绕通知。
对于获取返回值,前置和抛出异常后通知不存在返回值,后置通知返回值可有可无。
获取切入点方法运行异常信息,前置和返回后通知是不会有,后置通知可有可无。

1.获取参数

非环绕通知获取方式
在方法上添加JoinPoint,通过JoinPoint来获取参数

@Component
@Aspect
public class MyAdvice {
	@Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
	private void pt(){}
	
	@Before("pt()")
	public void before(JoinPoint jp)
		Object[] args = jp.getArgs();
		System.out.println(Arrays.toString(args));
		System.out.println("before advice ..." );
	}
}

思考:方法的参数只有一个,为什么获取的是一个数组?
因为参数的个数是不固定的,所以使用数组更通配些。
环绕通知获取方式
环绕通知使用的是ProceedingJoinPoint,因为ProceedingJoinPointJoinPoint类的子类,所以对于ProceedingJoinPoint类中应该也会有对应的getArgs()方法:

@Component
@Aspect
public class MyAdvice {
	@Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
	private void pt(){}
	
	@Around("pt()")
	public Object around(ProceedingJoinPoint pjp)throws Throwable {
		Object[] args = pjp.getArgs();
		System.out.println(Arrays.toString(args));
		Object ret = pjp.proceed();
		return ret;
	}
}

注意:
pjp.proceed()方法是有两个构造方法,分别是:
在这里插入图片描述
调用无参数的proceed,当原始方法有参数,会在调用的过程中自动传入参数。
所以调用这两个方法的任意一个都可以完成功能。
但是当需要修改原始方法的参数时,就只能采用带有参数的方法:

@Component
@Aspect
public class MyAdvice {
	@Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
	private void pt(){}
	
	@Around("pt()")
	public Object around(ProceedingJoinPoint pjp) throws Throwable{
		Object[] args = pjp.getArgs();
		System.out.println(Arrays.toString(args));
		args[0] = 666;
		Object ret = pjp.proceed(args);
		return ret;
	}
}

2.获取返回值

环绕通知获取返回值

@Component
@Aspect
public class MyAdvice {
	@Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
	private void pt(){}
	
	@Around("pt()")
	public Object around(ProceedingJoinPoint pjp) throws Throwable{
		Object[] args = pjp.getArgs();
		System.out.println(Arrays.toString(args));
		args[0] = 666;
		Object ret = pjp.proceed(args);
		return ret;
	}
}

上述代码中,ret就是方法的返回值,我们是可以直接获取,不但可以获取,如果需要还可以进行修改。
返回后通知获取返回值

@Component
@Aspect
public class MyAdvice {
	@Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
	private void pt(){}
	
	@AfterReturning(value = "pt()",returning = "ret")
	public void afterReturning(Object ret) {
		System.out.println("afterReturning advice ..."+ret);
	}
}

注意:
参数名必须一致。
参数类型可以写成String,但是为了能匹配更多的参数类型,建议写成Object类型。
如果有JoinPoint参数,参数必须放在第一位。

3.获取异常

环绕通知获取异常
这块比较简单,以前我们是抛出异常,现在只需要将异常捕获,就可以获取到原始方法的异常信息了。

@Component
@Aspect
public class MyAdvice {
	@Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
	private void pt(){}
	
	@Around("pt()")
	public Object around(ProceedingJoinPoint pjp){
		Object[] args = pjp.getArgs();
		System.out.println(Arrays.toString(args));
		args[0] = 666;
		Object ret = null;
		try{
			ret = pjp.proceed(args);
		}catch(Throwable throwable){
			t.printStackTrace();
		}
		return ret;
	}
}

在catch方法中就可以获取到异常。
抛出异常后通知获取异常

@Component
@Aspect
public class MyAdvice {
	@Pointcut("execution(* com.itheima.dao.BookDao.findName(..))")
	private void pt(){}
	
	@AfterThrowing(value = "pt()",throwing = "t")
	public void afterThrowing(Throwable t) {
		System.out.println("afterThrowing advice ..."+t);
	}
}

注意:
参数名必须一致。

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

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

相关文章

微服务框架 SpringCloud微服务架构 10 使用Docker 10.6 容器命令练习

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构10 使用Docker10.6 容器命令练习10.6.1 直接开干10 使用Docker 10.6 容器…

阿里“重推”的Spring+Boot+MVC+CloudAlibaba学习手册,开源下载

Spring框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶。Spring更是避免了重复造轮子的工作并跟随着互联网行业的发展做出不断的更新,很多研发人员把spring看作心目中最好的Java项目,没有之一。 可以毫不夸张的…

VS Code 扩展开发如何保持用户视觉体验一致

本文介绍如何在 VS Code 插件的 webview 中加载本地的资源文件,并如何使用 VS Code 自身的 UI 来实现用户视觉体验的一致。 背景 最近想做一个 VS Code 的插件用来简便我使用 VS Code 来编辑 Markdown 博客的体验,在设计插件的过程中,因为需…

计算机毕业论文Java项目源码下载S2SH智慧社区管理系统[包运行成功]

💖💖更多项目资源,最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《基于S2SH实现的智慧社区管理系统》该项目采用技术jsp、strust2、Spring、hibernate、tomcat服务器、mysql数据库 ,项目含有源码、答…

力扣hot100——第6天:32最长有效括号、33搜索旋转排序数组、34在排序数组中查找元素的第一个和最后一个位置

文章目录1.32最长有效括号1.1.题目1.2.解答2.33搜索旋转排序数组2.1.题目2.2.解答3.34在排序数组中查找元素的第一个和最后一个位置【代码随想录已刷】1.32最长有效括号 参考:力扣题目链接;题解1,题解2 1.1.题目 1.2.解答 这道题目官方的题…

FAT12文件系统

简介 FAT12文件系统是指:在磁盘上规定一种特定的存储格式,这种存储格式高效方便,功能强大,因此形成了统一的规定。 基础知识 具体来说FAT12文件系统为1.44M的软盘设计。1.44M的软盘有2880个扇区,一个扇区有512个字节&…

大数据下一代变革之必研究数据湖技术Hudi原理实战双管齐下-后续

文章目录集成Flink编程示例打包运行CDC入湖概述MySQL 启用 binlog初始化MySQL 源数据表准备Jar包依赖flink读取mysql binlog写入kafkaflink读取kafka数据并写入hudi数据湖调优MemoryParallelismCompaction集成Hive集成步骤Flink同步HiveHive Catalog集成Flink 编程示例 本节通…

[附源码]计算机毕业设计springboot右脑开发教育课程管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

微服务框架 SpringCloud微服务架构 10 使用Docker 10.4 容器命令案例1

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构10 使用Docker10.4 容器命令案例110.4.1 直接开干10.4.2 总结10 使用Docke…

03_openstack之项目及用户管理

目录 一、环境准备 二、项目管理 1、项目介绍 2、创建项目 三、用户管理 1、用户介绍 2、创建用户 一、环境准备 部署openstack私有云环境,步骤:02_openstack私有云部署_桂安俊kylinOS的博客-CSDN博客 以下操作均基于上述环境 二、项目管理 1、…

[附源码]计算机毕业设计springboot在线票务系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

基于采样的规划算法之RRT家族(三):RRT*

RRT算法是边随机产生节点边生长一棵路径树,当这棵树与目标点相遇,便从相遇点回溯到起点得到路径解。对于新产生的随机节点,原始RRT算法将路径树上距离它最近的节点作为它的父节点,并不能保证新节点通过该父节点就是最短路径。并且,就算新节点连接是最优的,也无法保证未来…

快速统计文本数字之和

实例需求:A列到F列为文本数据,每个单元格中包含3个数字,数字之间使用竖线分隔,现需要计算每个单元格中的数字之后。 例如F15单元格内容为10┃5┃18,则需要计算10、5、18三个数字之和,结果为33,…

【RTS】李宇翔 monibuca 讲座 学习

不解码,如何跳帧、追帧。启动工程,方便二次开发 按需引入引擎和插件流媒体应用 监控 : 物联网。转发 :用于会议,里面有很多会控逻辑,不同于流媒体本身。 起源于 FLASH视频会议 cs fms ams ,red5crtmpserver 很多问题 streaming服务器很难开发monaserver 基础上开发monib…

事业编招聘:新华社2023校园招聘正式启动

新华社是党中央一手创办和领导的新闻舆论机构,随着中国人民的革命事业和社会主义建设事业的发展而成长壮大,是一个具有光荣历史和优良传统作风的新闻机构。 新华社作为党中央喉舌、耳目、智库,是党的新闻舆论工作主力军、主渠道、主阵地。 …

【随笔记】分享一下26个常用的IDEA插件

文章目录1. Chinese Language2. Atom Material Icon3. Rainbow Brackets4. Translation5. Codota6. GenerateAllSetter7. GsonFormatPlus8. Alibaba Java Coding Guidelines9. Free Mybatis Tool10. maven-search11. Maven Helper12. CodeGlance Pro13. MyBatisCodeHelperPro14…

[附源码]计算机毕业设计学生在线考试系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[附源码]计算机毕业设计颐养天年辅助平台Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[附源码]JAVA毕业设计健康生活网站(系统+LW)

[附源码]JAVA毕业设计健康生活网站(系统LW) 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&…

114页5万字字智能交通大数据综合服务平台建设方案

目录 1.项目概述 1 1.1 项目名称 2 1.2 项目承担单位 2 1.3 建设方案编写单位 2 1.4 建设方案编制依据 2 1.5 建设目标、规模、周期 4 2.项目建设的必要性和可行性 6 2.1 现状及成果 6 2.1.1 xxx县交通运输局 6 2.2.2 公路管理领域 7 2.2.3 港航管理领域 7 2.2.4 工程质监领域 …