今天查看订单日志的时候发现有一些节点操作没有被日志记录到数据库,最后排查发现被同一个类直接this调用的方法都出现了日志注解失效的问题,因为不是同一个类调用是通过spring去实例化,但是直接this调用则不一样,网上有很多解决方法,想问一下大家有没有改动比较小的方案?
2条回答 默认 最新
关注 【以下回答由 GPT 生成】
问题分析: 这个问题是由于同一个类内部直接使用"this"关键字调用方法时,AOP切面失效的问题。而通过Spring实例化后调用方法时,AOP切面正常工作。
解决方案: 1. 首先,需要明确的是,AOP的切面只会在Spring管理的Bean之间有效。直接使用"this"关键字调用方法时,相当于在同一个类内调用,不会触发AOP切面。
-
如果希望在同一个类内部使用AOP切面,在调用方法时应该通过Spring容器获取Bean,而不是直接通过"this"关键字调用方法。
-
可以在同一个类内部使用@Autowired注解或者通过ApplicationContext获取Bean,并调用Bean的方法来达到目的。
示例代码如下:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; @Component public class MyService { @Autowired private ApplicationContext applicationContext; public void methodA() { // 使用@Autowired注解获取Bean MyService self = applicationContext.getBean(MyService.class); self.methodB(); // 或者使用ApplicationContext获取Bean MyService self2 = (MyService) applicationContext.getBean("myService"); self2.methodB(); } public void methodB() { // 执行具体的逻辑 } }
通过以上的改动,即可在同一个类内使用AOP切面,而不影响原有逻辑的实现。
总结: 通过在同一个类内部获取Spring管理的Bean,并调用Bean的方法来间接触发AOP切面,可以解决Java中同一个类调用时AOP失效的问题。这种解决方案不需要改动较大的代码,只需在调用方法时借助Spring容器获取Bean即可。
【相关推荐】
- 这个问题的回答你可以参考下: https://ask.csdn.net/questions/745634
- 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:JAVA问题记录-利用Spring AOP来拦截特定方法上的注解并根据业务修改注解字段值
- 您还可以看一下 杨春娟老师的初识篇:Spring框架(Java Spring案例精讲)课程中的 Spring AOP常用术语介绍小节, 巩固相关知识点
- 除此之外, 这篇博客: Java自定义注解、Spring AOP、使用AOP实现和自定义注解实现日志记录中的 2) @Around 注解描述的方法有一定要求: 部分也许能够解决你的问题。
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^解决 无用评论 打赏 举报-
悬赏问题
- ¥15 KeiI中头文件找不到怎么解决
- ¥15 QT6将音频采样数据转PCM
- ¥15 本地安装org.Hs.eg.dby一直这样的图片报错如何解决?
- ¥15 下面三个文件分别是OFDM波形的数据,我的思路公式和我写的成像算法代码,有没有人能帮我改一改,如何解决?
- ¥15 Ubuntu打开gazebo模型调不出来,如何解决?
- ¥100 有chang请一位会arm和dsp的朋友解读一个工程
- ¥50 求代做一个阿里云百炼的小实验
- ¥15 查询优化:A表100000行,B表2000 行,内存页大小只有20页,运行时3页,设计两个表等值连接的最简单的算法
- ¥15 led数码显示控制(标签-流程图)
- ¥20 为什么在复位后出现错误帧