如何使用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.hqwc.cn/news/703629.html

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

相关文章

Java项目:基于ssm框架实现的实验室耗材管理系统(B/S架构+源码+数据库+毕业论文+答辩PPT)

一、项目简介 本项目是一套基于ssm框架实现的实验室耗材管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 二、技术实现 jdk版本&#xff1a;1.8 …

FPGA - GTX收发器-K码 以及 IBERT IP核使用

一&#xff0c;前言 在FPGA - Xilinx系列高速收发器---GTX中详细介绍了GTX的基础知识&#xff0c;以及IP核的调用&#xff0c;下面将补充一下GTX在使用中的高速串行数据流在接收和发送时的控制与对齐&#xff08;K码&#xff09;&#xff0c;以及高速接口GTX&#xff0c;如果G…

echarts树图 改文本显示的地方的样式

树图改文本显示的时候的样式 虽然有点越改越丑 其中有一些失败的尝试 forammter 无法识别html元素 所以对于tooptips有用的html元素定义获取返回在这里写的话是不生效的 rich配置项里面的backgroundColor官方说支持 html元素和canvas元素 已经图片url 没有详细试验 官网地址 h…

Java05基础 数组

Java05数组 一、数组 数组指的是一种容器&#xff0c;可以用来存储同种数据类型的多个值。 1、数组的静态初始化 初始化&#xff1a;就是在内存中&#xff0c;为数组容器开辟空间&#xff0c;并将数据存入容器中的过程 1.1 数组定义格式 //格式一 数据类型[] 数组名 …

WHAT - CSS Animationtion 动画系列(二)

目录 一、循环波浪二、关键帧呼应三、关键帧顺接四、利用 transform-origin 做拉伸五、大元素可拆分多个小元素联动六、预留视觉缓冲七、随机感&#xff1a;动画周期设置八、抛物线&#xff1a;两个内外div实现x和y向量运动 今天我们主要学习动画实现要素。 一、循环波浪 利用…

深度学习面试问题 | 降维

本文给大家带来的百面算法工程师是深度学习降维面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的深度学习面试问题&#xff0c;并提供参考的回答及其理论基础&#…

windows部署腾讯tmagic-editor02-Runtime

创建editor项目 将上一教程中的hello-world复制过来&#xff0c;改名hello-editor 创建runtime项目 和hello-editor同级 pnpm create vite删除src/components/HelloWorld.vue 按钮需要用的ts types依赖 pnpm add tmagic/schema tmagic/stage实现runtime 将hello-editor中…

论文阅读 - Anatomy of an AI-powered malicious social botnet

论文链接&#xff1a; https://arxiv.org/pdf/2307.16336.pdf 目录 摘要 1引言 2 相关工作 2.1 LLM驱动的网络威胁 2.2 LLM生成的内容检测 2.3 社交机器人检测 2.4 由 LLM 增强的机器人 3 Fox8僵尸网络的识别 4 特性 4.1 配置文件 4.2 社交网络 4.3内容类型 4.4放…

多维 HighChart

showHighChart.html <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><!-- js脚本都是官方的,后两个是highchart脚本 --><script type"text/javascript" src"jquery1.7.1.min.js"&g…

摸鱼大数据——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…

vue使用marked和highlight.js实现代码高亮效果

marked是对markdown进行解析的插件&#xff0c;它可以把markdown语法解析成html语法&#xff0c;从而实现页面效果&#xff0c;而highlight.js是对解析出的代码实现高亮效果 效果&#xff1a; 安装&#xff1a;避免踩我走的坑&#xff0c;安装尽量按照这个版本安装 npm install…

武汉星起航:中国卖家借力亚马逊跨境电商平台,拓展全球销售市场

随着互联网技术的飞速发展&#xff0c;跨境电商已成为连接全球消费者与卖家的重要桥梁。作为全球领先的跨境电商平台&#xff0c;亚马逊凭借其强大的品牌影响力、丰富的商品资源和高效的物流体系&#xff0c;为全球消费者提供了一个便捷、安全的购物环境。在这个平台上&#xf…