AopContext.currentProxy();为什么能获取到代理对象

简介: AopContext.currentProxy();为什么能获取到代理对象

在同一个类中,非事务方法A调用事务方法B,事务失效,得采用AopContext.currentProxy().xx()来进行调用,事务才能生效。


B方法被A调用,对B方法的切入失效,但加上AopContext.currentProxy()创建了代理类,在代理类中调用该方法前后进行切入。对于B方法proxyA中调用只能对A进行增强,A里面调用B使用的是对象.B(),而不是$proxy.B(),所以对B的切入无效。


AopContext.currentProxy()使用了ThreadLocal保存了代理对象,因此

AopContext.currentProxy().B()就能解决。


在不同类中,非事务方法A调用事务方法B,事务生效。

在同一个类中,事务方法A调用非事务方法B,事务具有传播性,事务生效

在不同类中,事务方法A调用非事务方法B,事务生效。

Spring中创建动态代理有两种方式,即jdk动态代理、cglib动态代理。

jdk动态代理创建时JdkDynamicAopProxy中的invoke方法中存入的

 

cglib动态代理CglibAopProxy在创建代理时也存入了

相关文章
|
NoSQL 网络协议 数据库
为什么 Lettuce 会带来更长的故障时间
本文详述了阿里云数据库 Tair/Redis 将使用长连接客户端在非预期故障宕机切换场景下的恢复时间从最初的 900s 降到 120s 再到 30s的优化过程,涉及产品优化,开源产品问题修复等诸多方面。
67830 11
为什么 Lettuce 会带来更长的故障时间
|
测试技术
apifox的并发处理—通过动态变量实现
apifox的并发处理—通过动态变量实现
apifox的并发处理—通过动态变量实现
|
前端开发 网络协议 Dubbo
超详细Netty入门,看这篇就够了!
本文主要讲述Netty框架的一些特性以及重要组件,希望看完之后能对Netty框架有一个比较直观的感受,希望能帮助读者快速入门Netty,减少一些弯路。
90795 32
超详细Netty入门,看这篇就够了!
|
Java Android开发 p3c
Alibaba Java Coding Guidelines安装使用教程
Alibaba Java Coding Guidelines安装使用教程
8482 0
Alibaba Java Coding Guidelines安装使用教程
|
监控 Java Spring
AOP切入同类调用方法不起作用,AopContext.currentProxy()帮你解决这个坑
AOP切入同类调用方法不起作用,AopContext.currentProxy()帮你解决这个坑
1173 1
|
存储 算法 关系型数据库
(二十二)全解MySQL之分库分表后带来的“副作用”一站式解决方案!
上篇《分库分表的正确姿势》中已经将分库分表的方法论全面阐述清楚了,总体看下来用一个字形容,那就是爽!尤其是分库分表技术能够让数据存储层真正成为三高架构,但前面爽是爽了,接着一起来看看分库分表后产生一系列的后患问题,注意我这里的用词,是一系列而不是几个,也就是分库分表虽然好,但你要解决的问题是海量的。
971 3
|
8月前
|
IDE Java 开发工具
@Transactional 你真的用对了吗?
在日常开发中,`@Transactional`注解常用于声明式事务管理,但其原理和使用不当可能引发问题。本文通过一个实际场景探讨了自调用方法时事务不生效的问题,并分析了潜在风险:数据不一致。为解决此问题,提供了三种方案:1) 将方法移动到其他服务类;2) 使用`AopContext.currentProxy()`获取代理对象;3) 通过`ApplicationContext`获取Bean。最终建议尽量避免自调用事务操作,确保数据一致性。
304 6
|
9月前
|
消息中间件 中间件 Kafka
MQ四兄弟:如何实现延时消息
本文介绍了几种常见的消息队列系统(RabbitMQ、RocketMQ、Kafka和Pulsar)实现延时消息的方式。RabbitMQ通过死信队列或延时插件实现;RocketMQ内置延时消息支持,可通过设置`delayTimeLevel`属性实现;Kafka不直接支持延时消息,但可以通过时间戳、延时Topic、Kafka Streams等方法间接实现;Pulsar自带延时消息功能,提供`deliverAfter`和`deliverAt`两种方式。每种方案各有优劣,适用于不同的应用场景。
732 0
|
Java Maven 容器
Maven使用IDEA自带工具打包,同时将lib下的jar包打入,双击jar包可直接运行
使用IntelliJ IDEA的Artifacts功能,可以将项目依赖的第三方jar包打包进jar文件中,实现双击jar包即可直接运行。
Maven使用IDEA自带工具打包,同时将lib下的jar包打入,双击jar包可直接运行