原生CGLib内部方法互相调用时可以代理,但基于CGLib的Spring AOP却代理失效

背景:

校准程序校准一分钟前的数据,假设18:01:00开始校准 17:59:00 - 18:00:00,此时因订单批次行更新modifyTime由18:00:00修改为18:00:01,
mysql更新即时可见,es有延迟,查询17:59:00 - 18:00:00范围数据es有、mysql无,从es插入mysql数据,主表插入为saveorupdate操作,
其他表为save操作,主键冲突应回滚,但由于Spring aop内部方法调用无法被代理(事务)导致数据未回滚,旧状态覆盖了新状态,数据不一致。

1.原因分析

原生CGLib代理类,相当于重写原生类方法,且只保留代理类的对象proxyBean,所有调用都走proxyBean,所以可以被代理。

Spring AOP无法拦截内部方法调用,Spring会保留原生类的对象bean以及代理类的对象proxyBean,
proxyBean进行了切面增强处理,调用proxyBean相当于:

before
invoke(bean,method)
after

这样处理会导致内部方法调用时代理失效,传入的是原生类的对象bean,所以内部方法调用不可以被代理。

2.解决方案

  1. 修改类,不要出现内部“自调用”的情况,这是Spring文档中推荐的“最佳”方案;
  2. 若一定要使用“自调用”,那么this.doSomething()替换为代理类对象:((CustomerService) AopContext.currentProxy()).doSomething();
  3. 此时需要修改spring的aop配置:@EnableAspectJAutoProxy(exposeProxy = true);

Spring AOP内部方法调用代理失效相关推荐

  1. 【每日提高之声明式事物】spring声明式事务 同一类内方法调用事务失效

    2019独角兽企业重金招聘Python工程师标准>>> [问题] Spring的声明式事务,我想就不用多介绍了吧,一句话"自从用了Spring AOP啊,事务管理真轻松啊, ...

  2. spring声明式事务 同一类内方法调用事务失效

    一 宏观说明 [问题] Spring的声明式事务,我想就不用多介绍了吧,一句话"自从用了Spring AOP啊,事务管理真轻松啊,真轻松:事务管理代码没有了,脑不酸了,手不痛了,一口气全配上 ...

  3. springboot 调用方法事物_SpringBoot 内部方法调用,事务不起作用的原因及解决办法...

    在做业务开发时,遇到了一个事务不起作用的问题.大概流程是这样的,方法内部的定时任务调用了一个带事务的方法,失败后事务没有回滚.查阅资料后,问题得到解决,记录下来分享给大家. 场景 我在这里模拟一个场景 ...

  4. Spring Boot实践——Spring AOP实现之动态代理

    Spring AOP 介绍 AOP的介绍可以查看 Spring Boot实践--AOP实现 与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改 ...

  5. Spring AOP中的静态代理和动态代理的原理和实践

    对于最近博主最近写博客的兴致大发,我也在思考:为什么而写博客?在互联网时代,无论你是牛人大咖,还是小白菜鸟,都有发表自己看法的权利.无论你是对的还是错的,都会在这个平台上找到答案.所以,我会尽可能去写 ...

  6. AOP、ASPECT、Spring AOP、JDK动态代理、CGLib动态代理

    AOP.ASPECT.Spring AOP.JDK动态代理.CGLib动态代理 1 AOP介绍 1.1 基本定义 AOP(Aspect Oriented Programming)称为面向切面编程,它是 ...

  7. Spring——AOP学习(静态代理和动态代理模式)

    Spring--AOP学习(静态代理和动态代理模式) 一.代理模式 我们知道学习Spring最重要的两个知识点就是IOC和AOP,AOP的主要思想就是动态代理模式.在了解AOP之前我们必须学习动态代理 ...

  8. Spring事务内方法调用自身事务

    Spring事务内方法调用自身事务 增强的三种方式 ServiceA.java文件: 查看Spring Tx的相关日志: 可以看到只创建了一个事物ServiceA.service方法的事务,但是cal ...

  9. Spring AOP 概念及动态代理模式

    Spring AOP 概念及动态代理模式 文章目录 Spring AOP 概念及动态代理模式 1 AOP 的概念及相关术语 2 AOP 作用 3 AOP 原理概述 3.1 JDK 动态代理(Proxy ...

  10. Spring的refresh()方法调用过程

    Spring的refresh()方法调用过程 refresh()是Spring中比较核心的方法,Spring所有的初始化都在这个方法中完成 具体代码如下 public void refresh() t ...

最新文章

  1. SmartAuditor----IT访问审计解决方案
  2. RNAseq-GO、biomaRt转换ID
  3. poj1654 Area
  4. mysql超大数据库备份
  5. VC6如何使用VS2005中的CImage类功能
  6. android ListView详解
  7. 鲜为人知的软件项目管理原则(转)
  8. 计算机兴趣班记录,计算机兴趣班活动记录.doc
  9. NodeJS同步MySQL上游数据到ElasticSearch数据库中
  10. 输入网址后,浏览器从访问服务器到呈现网页的过程
  11. mysql数据生产数据分析_基于MySQL玩转SQL数据分析课程 互联网数据分析师-SQL数据分析实战视频教程...
  12. #leetcode刷题之路39-组合总和
  13. 百面机器学习—10.循环神经网络面试问题总结
  14. 手把手教你架构3D引擎高级篇系列四
  15. 【Windows】手机远程控制电脑
  16. Tensorflow-gpu运行时报错Non-OK-status: GpuLaunchKernel
  17. 物联网终端安全系列(之一) -- 物联网终端安全风险简析
  18. thinkphp6 websocket-room的加入房间+离开房间+房间消息发送
  19. Android 中获取网络下载速率的方法
  20. python读取和写入 gzip和bz2格式的压缩文件中的数据

热门文章

  1. amap高德地图应用(el-amap-marker坐标点;el-amap-info-window信息窗体;el-amap-polyline折线、折线颜色,宽度、实虚线等)
  2. [锁 Lock] Lock lock = new ReentrantLock()之自增序列号
  3. iexplore.exe - Application Error The instruction at 0x7c0c5a6c references at memory at 0x7c0c5a6c
  4. linux环境变量设置详解
  5. vue之menu弹出菜单效果
  6. ArrayList的使用方法
  7. 1116: 删除元素(函数)C语言
  8. html座机正则表达式,java座机号码正则表达式
  9. 【日常训练赛】C - Prove Him Wrong
  10. vba msgbox html 标签,VBA更改MsgBox中的文本颜色