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

news2024/9/23 3:26:18

最近在工作中遇到一个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.coloradmin.cn/o/1678463.html

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

相关文章

揭秘SmartEDA魅力:为何众多学校青睐这款电路仿真软件?

在当今数字化、信息化的教育时代&#xff0c;电子电路仿真软件已成为电子学教学不可或缺的重要工具。其中&#xff0c;SmartEDA电路仿真软件以其强大的功能、用户友好的界面以及丰富的教育资源&#xff0c;赢得了众多学校的青睐。那么&#xff0c;究竟是什么原因让SmartEDA成为…

解决Win11下SVN状态图标显示不出来

我们正常SVN在Windows资源管理器都是有显示状态图标的&#xff0c; 如果不显示状态图标&#xff0c;可能你的注册表的配置被顶下去了&#xff0c;我们查看一下注册表 运行CMD > regedit 打开注册表编辑器 然后打开这个路径&#xff1a;计算机\HKEY_LOCAL_MACHINE\SOFTWARE…

【LeetCode刷题】27. 移除元素

1. 题目链接2. 题目描述3. 解题方法4. 代码 1. 题目链接 27. 移除元素 2. 题目描述 3. 解题方法 暴力法直接解决&#xff0c;用双层for循环&#xff0c;外层for循环找val&#xff0c;内层for循环做删除操作。双指针法&#xff0c;fast和slow。fast找不是val的值&#xff0c;…

在Ubuntu上的QT创建工程并打包项目

一、环境准备 参考UbuntuQT安装 二、创建项目&#xff0c;点击choose 设置项目名字路径等&#xff0c;点击下一步 默认&#xff0c;点击下一步 设置函数名字&#xff0c;保持默认&#xff0c;下一步 保持默认&#xff0c;点击下一步 继续&#xff0c;下一步 点击完成 三…

22 优化日志文件统计程序-按月份统计每个用户每天的访问次数

读取任务一中序列文件&#xff0c;统计每个用户每天的访问次数&#xff0c;最终将2021/1和2021/2的数据分别输出在两个文件中。 一、创建项目步骤&#xff1a; 1.创建项目 2.修改pom.xml文件 <packaging>jar</packaging> <dependencies><dependency>…

听劝!普通人千万别随意入门网络安全

一、什么是网络安全 网络安全是一种综合性的概念&#xff0c;涵盖了保护计算机系统、网络基础设施和数据免受未经授权的访问、攻击、损害或盗窃的一系列措施和技术。经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”…

Linux-页(page)和页表

本文在页表方面参考了这篇博客&#xff0c;特别鸣谢&#xff01; 【Linux】页表的深入分析 1. 页帧和页框 页帧&#xff08;page frame&#xff09;是内存的最小可分配单元&#xff0c;也开始称作页框&#xff0c;Linux下页帧的大小为4KB。 内核需要将他们用于所有的内存需求&a…

【Git教程】(十九)合并小型项目 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 合并小型项目 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现 在项目的初始阶段&#xff0c;往往需要针对重要的设计决策和技术实现原型实验。当原型评估结束后&#xff0c;需要将那些成功的原型合并起来称为整个项目的初始版本。 在这样的情景中&#xff0c;各个原…

什么是ARP攻击,怎么做好主机安全,受到ARP攻击有哪些解决方案

在数字化日益深入的今天&#xff0c;网络安全问题愈发凸显其重要性。其中&#xff0c;ARP攻击作为一种常见的网络攻击方式之一&#xff0c;往往给企业和个人用户带来不小的困扰。ARP协议是TCP/IP协议族中的一个重要协议&#xff0c;负责把网络层(IP层)的IP地址解析为数据链路层…

Vmvare—windows中打不开摄像头

1、检查本地摄像头是否能正常打开 设备管理器—查看—显示隐藏设备—选中照相机—启动 USB2.0 HD UVC—打开相机查看 2、检查虚拟机的设置 虚拟机—虚拟机—可移动设备—USB2.0 HD UVC—勾选在状态栏中显示 虚拟机—打开windows主机—右小角选中圆圈图标—勾选连接主机 此时…

办公园区建筑科技风效果(html+threejs)

办公楼科技风(Htmlthreejs) 初始化三维场景 function init() {container document.getElementById(container);camera new THREE.PerspectiveCamera(65, window.innerWidth / window.innerHeight, 0.1, 150000000);camera.position.set(550, 600, 690);scene new THREE.Sce…

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

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

探索数据结构(让数据结构不再成为幻想)

目录 什么是数据结构 数据与结构 什么是算法 复杂度分析 时间复杂度与空间复杂度 时间复杂度 思考&#xff1a; 空间复杂度 常数阶O(1) 对数阶O(logn) 线性阶O(n) 以下为空间复杂度为O(n) 线性对数阶O(nlogn) 平方阶O(n) 指数阶O(2^n) 什么是数据结构 数据结构…

Python送你小花花

快到520了&#xff0c;准备好送上你的爱意了吗&#xff1f; 还记得去年从网上模仿了一篇python使用turtle画的小花花程序&#xff0c;当时还没有转行到程序员行业&#xff0c;刚刚入门学习编程&#xff0c;还在纠结是学习python、Java还是C#的时候。 总会被一些猎奇的内容吸引&…

uniapp如何打包预约按摩H5?

uniapp如何打包预约按摩H5&#xff1f; 开发工具&#xff1a;HBuilderX 一、如何修改域名配置&#xff1f; 1、修改公众号AppID、页面访问路径 1&#xff09;gzh_appid: 公众号AppID siteroot: 域名&#xff0c;需更换为你自己的域名以及公众号APPID&#xff0c;域名格式【htt…

雍禾植发张东宏:以诚相待毛发患者

医学道路上的奋斗往往需要坚定的信念和不懈的努力。对于张东宏医生来说&#xff0c;医学并非止步于书本知识&#xff0c;而是一次次与患者对话、一次次实操中的历练和积累。在他的成长历程中&#xff0c;医学之路如同一棵参天大树&#xff0c;每一步都是扎实的打磨&#xff0c;…

windows设置Redis服务后台自启动

问题 在日常开发过程中&#xff0c;redis是我们常用的缓存工具&#xff0c;但是由于redis对于Linux系统进行开发的&#xff0c;在Linux系统里可以通过修改redis.conf从而从而实现后台启动。 daemonize no 改成 daemonize yes 但是在window上如何也进行后台运行呢&#xff0c…

Arduino红外遥控器,控制继电器水泵

我们将讨论如何使用Arduino和IRremote库来实现通过红外遥控器控制继电器的开关。通过这个项目&#xff0c;你将学会如何接收和解码红外信号&#xff0c;并根据接收到的信号控制继电器&#xff08;这里的继电器可以换成其他传感器&#xff09;的状态。 项目简介 我们将使用Ard…

自由职业是种怎样的体验?普通人如何成为一名自由职业者?

自由职业在哪都能办公自由职业在哪都要办公。 放弃幻想&#xff0c;没有不辛苦的工作&#xff0c;5年经验后端开发程序员&#xff0c;已经从事自由职业1年半&#xff0c;今天就来客观分享一下自由职业的利与弊。 时间自由&#xff0c;减少中间商赚差价 自由职业最让人羡慕的就…