如何使用AspectJ做切面,打印jar包中方法的执行日记

最近在工作中遇到一个redis缓存中的hash key莫名其妙被删除的问题,我们用了J2Cache,二级缓存用的是redis。hash key莫名其妙被删除又没有日志,就想到做一个切面在调用redis删除hash key的方法的时候,打印日志,并且把调用链路打印出来。

但是这个类的对象不是spring ioc容器管辖的,所以没有办法使用spring AOP,只能用AspectJ。

AspectJ把切面代码织入目标代码有两种方式,一种是编译时织入,一种是类加载时织入

因为目标代码是第三方jar包的,所以这里只能选择类加载时编织(Load-time Weaving, LTW)

redis客服端使用的是lettuce,一开始我选择对io.lettuce.core.api.sync.RedisHashCommands#hdel这个方法打印日志,但是这是一个接口,而底层的具体的实现是一个代理类,切到这个代理类破费了一番功夫,最后执行还是报错:

java.lang.NoSuchMethodError:*.RedisDelCommandAop.aspectOf()L*/RedisDelCommandAop

实在没有办法放弃对RedisHashCommands进行切面,而改成对J2Cache中的二级缓存Level2Cache.evict方面进行切面。Level2Cache.evict切面成功后,对代理类切面也成功了(后面有详细叙述)。

普通类切面步骤有4步:

1 增加aspectJ依赖,这里以maven为例

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.19</version></dependency>
</dependencies>

2. 配置aop.xml

src/main/resources/META-INF 目录下创建并配置 aop.xml 文件:

<aspectj><weaver options="-verbose -showWeaveInfo"><!-- 目标类的包名,不确定直接用* --><include within="com.example..*"/></weaver><aspects><!-- 自定义切面类全路径 --><aspect name="com.example.MyAspect"/></aspects>
</aspectj>

3. 定义切面类

package com.example;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;@Aspect
@Slf4j
public class MyAspect {@Before("execution(* com.example..*(..))")public void beforeMethod() {System.out.println("A method is about to be executed.");}// 切到某个接口下所有实现类的表达式@Around("execution(* net.oschina.j2cache.Level2Cache+.evict(..))")public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {Object[] args = joinPoint.getArgs();log.debug("evict方法入参:{}", Arrays.toString(args));StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();for (StackTraceElement element : stackTrace) {log.debug(element.getClassName() + "." + element.getMethodName());}return joinPoint.proceed();}
}

4. 运行时加入JVM参数,指向aspectjweaver的jar包,要确保路径正确

-javaagent:path/to/aspectjweaver.jar 

代理类切面需要增加的步骤

  1. 表达式

    @Around("execution(* com.sun.proxy.$Proxy*.hdel(..))")
    
  2. aop文件中增加开启切代理类

    <aspectj><weaver options="-verbose -showWeaveInfo -Xset:weaveJavaxPackages=true -Xset:weaveAllIo=true -Xset:weaveAllProxies=true"><!-- Include the packages to be woven --><include within="*"/></weaver><aspects><!-- Specify the aspects to be woven --><aspect name="*.RedisDelCommandAop"/></aspects>
    </aspectj>
    
  3. 启动类上加上注解,后面测试这个步骤不加也可以成功

    @EnableAspectJAutoProxy
    

记录下我遇到的问题:

  1. idea运行的时候配置JVM参数,选错了地方。
    在这里插入图片描述

  2. 打印日志定位aspectJ相关问题

    加入JVM参数,开启aspectJ日志打印:

    -Dorg.aspectj.weaver.showWeaveInfo=true -Dorg.aspectj.weaver.verbose=true
    

    如果配置正确,会打印如下日志:
    在这里插入图片描述

    如果切面类不正确上面日志最后一行就是error Cannot register,原因是切面类上忘记加注解:@Aspect

    另外如果表达式不正确,没有切到切面,就不会打印下面的日志:
    在这里插入图片描述

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

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

相关文章

MES系统追溯管理功能,迅速定位问题源头

一、MES系统概述 MES系统是一种实现车间生产智能化、信息化的管理系统&#xff0c;通过对生产现场的数据进行实时采集、处理和分析&#xff0c;为企业管理者提供准确、及时的生产信息。MES系统主要包括生产订单管理、物料追溯、质量管理、设备管理、物料管理、人员管理等功能模…

品鉴中的食物搭配:如何创造美味的红酒与食物组合

品鉴云仓酒庄雷盛红酒时&#xff0c;食物搭配是一个不可忽视的环节。通过巧妙的搭配&#xff0c;红酒与食物可以相互衬托&#xff0c;呈现出更加美妙的风味。下面就让我们一起探讨如何创造美味的红酒与食物组合。 首先&#xff0c;了解红酒与食物的搭配原则是关键。一般来说&a…

解决wangEditor使用keep-alive缓存后,调用editor.cmd.do()失败

前提&#xff1a;wangeditor版本&#xff1a;4.7.11 vue版本&#xff1a;vue2 问题&#xff1a;在使用wangeditor富文本编辑器时&#xff0c;需求需要通过点击一个按钮&#xff0c;手动插入定义好的内容&#xff0c;所以使用了 editor.cmd.do(insertHTML, ....) 方法新增…

ChatGPT未来可能应用于iPhone?

苹果接即将与OpenAI达成协议 ChatGPT未来应用于iPhone 前言 就在5月11日&#xff0c;苹果公司正与OpenAI进行深入讨论&#xff0c;计划在其最新的iOS操作系统中整合OpenAI的先进技术。这一举措是苹果公司在为其产品线融入更先进的人工智能功能所做努力的一部分。 目前情况双方…

人机协同中的比较、调整与反转

人机协同是指人与机器之间的合作关系&#xff0c;通过共同努力实现特定任务的目标。在人机协同中&#xff0c;存在着比较与调整的过程&#xff0c;这是为了实现更好的合作效果和任务完成质量。 比较是指人与机器在任务执行过程中对彼此的表现进行评估和比较。这可以通过对机器的…

Prosys OPC UA Simulation Server工程文件备份方法

Prosys OPC UA Simulation Server是一款免费的OPC UA服务器仿真软件&#xff0c;具体的使用和下载参考官网&#xff1a; Prosys OPC - OPC UA Simulation Server Downloads 他的免费版本不提供工程文件的备份、导入导出功能&#xff0c;每次退出时保存。如果需要工程备份&a…

动规解决01背包/完全背包精讲

还不会用动态规划解决01背包/完全背包&#xff1f;看这一篇文章就够了&#xff01; 首先我们要明白什么是01背包和完全背包。 背包问题总体问法就是&#xff1a; 你有一个背包&#xff0c;最多能容纳的体积是V。 现在有n个物品&#xff0c;第i个物品的体积为vi​ ,价值为wi​…

Unity使用sherpa-onnx实现离线语音合成

sherpa-onnx https://github.com/k2-fsa/sherpa-onnx 相关dll和lib库拷进Unity&#xff0c;官方示例代码稍作修改 using SherpaOnnx; using System; using System.IO; using System.Runtime.InteropServices; using UnityEngine;public class TTS : MonoBehaviour {public st…

电脑压缩图片怎么压缩?简单高效的压缩技巧

当我们将一些图片上传到各大网站的时候&#xff0c;经常会被提示图片大小超过网站的限制而被禁止上传&#xff0c;其实这是网站的一种防御措施&#xff0c;防止大量体积太大的图片占用了网站服务器的存储空间&#xff0c;从而影响用户体验&#xff0c;所以为了解决这个问题&…

详解xlsxwriter 操作Excel的常用API

我们知道可以通过pandas 对excel 中的数据进行处理分析&#xff0c;但是pandas本身对格式化数据方面提供了很少的支持&#xff0c;如果我们想对pandas进行数据分析后的数据进行格式化相关操作&#xff0c;我们可以使用xlsxwriter&#xff0c;本文就对xlsxwriter的常见excel格式…

摸鱼大数据——Linux搭建大数据环境(安装zooKeeper和zookeeper shell命令)五

安装zookeeper软件 1.上传软件 使用CRT等客户端远程上传 zookeeper-3.4.6.tar.gz 文件到/export/software目录下 2.解压软件 [rootnode1 ~]# cd /export/software/ [rootnode1 software]# tar -xzvf zookeeper-3.4.6.tar.gz -C /export/server/ [rootnode1 software]# cd /ex…

未来IT行业的模块化、学习与跨界融合

随着技术的快速发展&#xff0c;IT行业已成为推动全球经济和社会发展的核心动力。从云计算和大数据到人工智能&#xff08;AI&#xff09;和物联网&#xff0c;这些创新技术正在彻底改变我们的生活方式和工作模式。而在AI领域&#xff0c;尤其是人工智能生成内容&#xff08;AI…

javaSE:类和对象

面向对象 java是一种面向对象的编程语言&#xff0c;面向对象就是把能为我们所用的东西直接拿来使用&#xff0c;省去中间过程&#xff0c;比如洗衣服&#xff0c;要完成这一个动作&#xff0c;我们本来需要一个盆&#xff0c;放水&#xff0c;放衣服&#xff0c;换水&#xf…

【算法-程序的灵魂#谭浩强配套】(适合专升本、考研)

无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 完整资料如下&#xff1a; 1.一个程序主要包括以下两方面信息&#xff1a;程…

python中cv2,等等如何修改为中文字体显示,这里以人脸表情识别中文标签为例

中文字体显示 首先下载字体包部署字体包代码实现部分 想必大家在使用python过程中都会遇到&#xff0c;想要显示中文的时候&#xff0c;但是py基本上都是英文字体&#xff0c;下面我将给大家提供一个比较好的解决方案&#xff1a; 首先下载字体包 方法&#xff1a; 我使用的是…

亚信安全发布《2024年第一季度网络安全威胁报告》

亚信安全2024年第一季度网络安全威胁报告 一季度威胁概览 《亚信安全2024年第一季度网络安全威胁报告》的发布旨在从一个全面的视角解析当前的网络安全威胁环境。此报告通过详尽梳理和总结2024年第一季度的网络攻击威胁&#xff0c;目的是提供一个准确和直观的终端威胁感知。…

机器学习:葡萄酒品质预测

说明&#xff0c;此项目是我的期末大作业&#xff0c;包括了对数据集探索&#xff0c;预处理以及分类的各个详细过程与描述&#xff0c;代码简单&#xff0c;主要是一个分类项目的流程&#xff0c;并没有对模型进行深度研究&#xff0c;因此我写在这里。 目录 一、问题介绍 …

GPT5 如何使用?GPT5 如何订阅?GPT5 功能全面详解

结论是&#xff1a;GPT2 很糟糕 &#xff0c;GPT3 很糟糕 &#xff0c;GPT4 可以 &#xff0c;但 GPT5 会很好。 ChatGPT5今年发布 GPT5发布的具有推理功能的不断发展&#xff0c;就像 iPhone 一样。 Sam Altman 于 17 日&#xff08;当地时间&#xff09;&#xff0c;在世界…

Redis-分片集群存储及读取数据详解

文章目录 Redis分片集群是什么&#xff1f;Redis分片集群的存储及读取数据&#xff1f; 更多相关内容可查看 Redis分片集群是什么&#xff1f; Redis分片集群是一种分布式部署方式&#xff0c;通过将数据分散存储在多个Redis节点上&#xff0c;从而提高了系统的性能、扩展性和…

电子邮箱怎么注册?电子邮箱注册教程,只需要三步

电子邮箱在我们工作和生活中都是必不可少的沟通工具。电子邮箱怎么注册&#xff1f;电子邮箱的注册步骤是怎么样的&#xff1f;本文将从电子邮箱注册前的准备资料介绍&#xff0c;到具体电子邮箱注册的三个步骤进行详细讲解。 一、电子邮箱注册前的准备 电子邮箱是一个具有唯…