Spring AOP对嵌套方法不起作用的解决
作者:波波仔86 发布时间:2022-01-08 16:55:03
标签:Spring,AOP,嵌套方法
Spring AOP对嵌套方法不起作用
今天在调研系统操作记录日志时,好多教程都是借助于Spring AOP机制来实现。于是也采用这种方法来实现。在Service中的删除日志方法上注解自定义的切点,但是执行没有生效。
代码如下:
//尝试删除溢出日志
public synchronized void tryDelOverflowLog() {
logNum++;
if (logNum - LogConst.MAX_NUM > 0) {
int delNum = logNum - LogConst.MAX_NUM + LogConst.EXTRA_NUM;
logNum -= delNum;
removeOverflowLog(delNum);
}
}
//日志溢出后,删除最新入库的日志
@ServiceLog(type = LogConst.TYPE_LOG_RECORD, description = "操作日志缓存区溢出,系统自动清空缓存区")
public void removeOverflowLog(int delNum) {
custLogMapper.removeOverflowLog(delNum);
}
在使用 Spring AOP 的时候,我们从 IOC 容器中获取的 Service Bean 对象其实都是代理对象,而不是那些 Service Bean 对象本身,也就是说获取的并不是被代理对象或代理目标。当我在自己的 Service 类中使用 this 关键字嵌套调用同类中的其他方法时,由于 this 关键字引用的并不是该 Service Bean 对象的代理对象,而是其本身,故 Spring AOP 是不能拦截到这些被嵌套调用的方法的。
要解决这个问题
最简单的方法是把自身注入到自身,用注入的这个自身去调用本方法。或者你也可以不用spring aop而是用aspectj weaving,倒是可以测底的解决该问题。我采用的是把自身注入到自身中。
/**
* 通过注入自身解决,Spring AOP嵌套调用不生效的问题
*/
@Autowired
private ApplicationContext applicationContext;
private LogService self;
@PostConstruct
private void init() {
self = (LogService) applicationContext.getBean("logService");
}
//尝试删除溢出日志
public synchronized void tryDelOverflowLog() {
logNum++;
if (logNum - LogConst.MAX_NUM > 0) {
int delNum = logNum - LogConst.MAX_NUM + LogConst.EXTRA_NUM;
logNum -= delNum;
self.removeOverflowLog(delNum);
}
}
Spring AOP、嵌套调用失效及解决
加入注解
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
获取当前代理的接口
public interface ICurrentAopProxyService<T> {
default T getCurrentProxyService() {
return (T) AopContext.currentProxy();
}
}
需要嵌套调用的Service实现它
调用的时候改写代码
public SysMerchantVersion selectByMerchantId(Long merchantId) {
return getCurrentProxyService().getOne(new QueryWrapper<SysMerchantVersion>()
.lambda()
.eq(SysMerchantVersion::getMerchantId, merchantId));
}
来源:https://blog.csdn.net/bobozai86/article/details/78896487


猜你喜欢
- <script>//验证身份证号方法var test=function(idcard){var Errors=new Array
- 如今APP越来越多,我们每天所使用的的软件也越来越多,可是在我们不付费的情况下,App制造商如何实现,实现收入甚至是盈利呢?答案就是在我们打
- Android EditText输入手机号空格开发需求是在登录页面的手机EditText中间插入空格,让用户看起来方便点, 130 1234
- 在互联网的服务端开发的时候,我们很经常要在一个项目中去调用不同的数据库。在这种情况下,必然要涉及到多数据源问题。那么,我们该如何解决多数据源
- 泛型中 T 类型变量 和 ? 通配符 区别定义不同 :T 是类型变量,? 是通配符使用范围不同:? 通配符用作 参数类型、字段类型、局部变量
- 本文实例讲述了Android编程防止进程被第三方软件杀死的方法。分享给大家供大家参考,具体如下:项目测试的时候发现,按home键回到桌面,再
- TTL简介TTL 是什么呢?TTL 是 RabbitMQ 中一个消息或者队列的属性,表明一条消息或者该队列中的所有消息的最大存活时间,单位是
- 本文实例讲述了C#快速排序算法。分享给大家供大家参考。具体实现方法如下:public static int[] QuickSort(int[
- 循环对数组进行拷贝利用循环对数组进行拷贝很简单,就是利用循环将要拷贝的数组的元素逐个赋值给新的数组。具体代码实现如下:public stat
- 前言新建的Compose项目默认的 Material 主题为我们提供了一些颜色,但对我这种花里胡哨的人来说根本不够呀。
- 【诞生背景】最近在做某配置中心的时候,配置中心采用properties格式进行配置的(如下图)。而我们工程的项目配置文件是yml格式的(如下
- 本文介绍Android平台进行数据存储的五大方式,分别如下:1 使用SharedPreferences存储数据2 文件存储数据 &
- 目录1.堆空间的基本结构:2.空间分配担保机制3.如何判断一个对象已经无效4 不可达的对象并非“非死不可”5 如何判断一个常量是废弃常量?6
- 一、背景有时我们在做开发的时候需要记录每个任务执行时间,或者记录一段代码执行时间,最简单的方法就是打印当前时间与执行完时间的差值,一般我们检
- ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上
- StringBuilder与StringBuffer是两个常用的操作字符串的类。大家都知道,StringBuilder是线程不安全的,而St
- 在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked ex
- 包括系统钩子和线程钩子,或者叫全局钩子和私有钩子。系统钩子需要一个单独的DLL,这个地方耽误了不少时间,网上有说可以不用单独DLL的。 现在
- 本文实例为大家分享了安卓实现单行多列横向滚动,供大家参考,具体内容如下<GridLayout android:layou
- 一、项目简述本系统功能包括:通知公告,老人管理,护工管理,问答管理等等功能。二、项目运行环境配置: Jdk1.8 + Tomcat8.5 +