Spring获取当前类的代理类(用于类内部方法调用事务不生效的情况)

Aspect声明式事物解决Spring事物内部调用不生效 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。在之前解释Spring事物不生效时,列举了很多方面的原则,详细参考Spring事物不生效的原因其中说到了一点:在类内部调用调用类内部@Transactional标注的方法。这种情况下也会导致事务不开启。 阅读详情
AI摘要

本文探讨了在Spring中如何通过@Autowired、@Resource注解或BeanFactory来获取并使用事务代理对象,强调了@EnableAspectJAutoProxy(exposeProxy=true)的重要性。文章解释了为何需要设置exposeProxy为true,因为代理对象通常存储在ThreadLocal中,并展示了获取代理对象的代码片段。同时,提到了在使用Spring声明式事务时应注意事务的传播特性,以避免潜在问题。

1. 使用@Autowired注解或者@Resource注解注入自己,然后使用注入的代理类去调用事务方法。如下:

2. 注入BeanFactory容器,使用容器获取代理类,然后使用代理类调用事务方法。如下:

3. 在类上面添加注解@EnableAspectJAutoProxy(exposeProxy = true),然后在类中获取当前类的代理类,使用代理类调用事务方法。如下:

注:如果不添加注解的话,可能会出现以下错误

java.lang.IllegalStateException: Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.  

解析:为什么需要exposeProxy = true

  1. 代理对象的获取其实是从线程的ThreadLocal中获取的,如下:
  2. 对象是什么时候放进去的呢,查看JdkDynamicAopProxy和CglibAopProxy,其中有以下代码,所以注解中需要先置为true才会将代理对象设置进去。

备注:使用Spring的声明式事务时需要注意事务的传播特性,避免使用时出现问题。

不用U盘也能装Ubuntu?手把手教你用EasyUEFI搞定双系统(附企业版资源) 本文详细介绍了无需U盘即可安装Ubuntu双系统的方法。通过使用EasyUEFI工具,在Windows环境下创建虚拟启动分区并配置UEFI引导,即可直接从硬盘启动Ubuntu安装程序。该方法特别适合开发者或技术爱好者快速搭建Linux开发环境,操作安全便捷,无需额外物理介质。 阅读详情

相关推荐

RK3588 C-PHY摄像头驱动升级踩坑记:从‘Only CSI2 supported’报错到成功取流

本文详细记录了在RK3588平台上调试C-PHY摄像头驱动的全过程,从‘Only CSI2 supported’报错分析到成功取流。内容涵盖C-PHY与CSI-2协议差异、SDK版本对比、V4L2框架下的bus-type解析机制,以及硬件排查与寄存器调优实战经验,为嵌入式Camera驱动工程师提供宝贵参考。

weixin_42522374的博客 122

Spring aop 通过获取代理对象实现事务切换

摘要:在项目中,涉及到同一个类中一个方法调用另外一个方法,并且两个方法的事务不相关, 这里面涉及到一个事务切换的问题,一般的方法没问题,根据通过aop注解在方法上通过加注解标识, 答案是:通过spring aop类里面的AopContext类获取当前类的代理对象, 这样就能切换对应的事务管理器了,具体做法如下: (1).在applicationContext.xml文件中配置如下:

_William_Cheung的博客 5459

QEMU pcie config空间访问机制

而pci_host_conf/data_le_ops的定义是在hw/pci/pci-host.c里,对于0xCF8端口的处理,因为是地址选通,所以只需要在write的时候记录、read的时候返回记录的值即可。而pci_host_config_write/read_common接口,在前256Bconfig空间的模拟中,也同样是会调用这个接口,所以后续的处理都是一样的。这是真实的硬件设计,而对于QEMU+KVM的虚机场景,显然是要基于硬件实现和虚拟化的需求设计虚机访问config空间的完整流程。

leiyanjie8995的博客 1950

使用AopContext.currentProxy()获取当前类的代理对象

在controller层调用service的方法的时候,是可以被切入的,但是如果我们在service层 A方法中,调用B方法,切点切的是B方法,那么这时候是不会切入的。

喜欢吃糖丶的博客 4161

GD32F103VBT6串口OTA升级保姆级教程:当硬件没留Boot0引脚时,我是如何用Keil和Ymodem搞定的

本文详细介绍了GD32F103VBT6在无Boot0引脚情况下的串口OTA升级方案,通过Keil工程改造和Ymodem协议实现可靠固件更新。文章涵盖Bootloader配置、APP工程调整、Ymodem传输优化等关键步骤,为嵌入式开发者提供了一套完整的解决方案,特别适用于封闭式设备的远程更新需求。

weixin_28744613的博客 183

“迎圣诞,拿大奖” 活动赛题 Web-SQLi

1. php中sprintf()函数漏洞原理及其利用; 2. mysql盲注语法及python脚本; 3. sqlmap的需要进一步学习;

qq_34106499的博客 674

SpringBoot使用当前类代理类(内部事务)解决方案

在开发中,我们时常遇到需要在一个类的内部调用自己的其他方法,并且这些方法可能需要事务支持。这种场景通常发生在业务逻辑较为复杂的服务类中,其中一些操作需要确保数据的一致性和完整性。本文将以类为例,探讨如何在中有效地使用当前类的代理类来处理内部事务。

m0_51390969的博客 1638

Hermes 教程 03:Skills 系统

摘要:Hermes Skills是一种自我改进机制,可将解决问题的经验保存为可复用技能文档。v0.13.0版本遵循agentskills.io开放标准,与Claude Skills互通。技能创建流程包括发现问题、创建技能文件、加载使用和优化更新四个阶段。系统提供技能检索和自维护机制(Curator),支持技能媒体路由和多种管理命令。内置技能涵盖开发调试、创意头脑风暴等场景,通过积累技能使Hermes更适应用户需求。

程序猿_三产 727

spring 6:HTTP Interface——获取HTTP服务的代理类并放置到IOC容器内

spring 6最近发布了新版本,带来了一个新特性HTTP interfaces。可以将http服务定义为一个java接口,通过Http服务代理工厂生成http代理类并通过接口方法进行http调用。

秋雨 De Blog 1393

YOLOv13添加DRB模块map暴涨12.33!准确率提升8.56!召回率提升15.66

本文介绍了在YOLOv13模型中添加DRB模块的改进方法。实验结果显示,添加DRB模块后模型性能显著提升,mAP暴涨12.33%,准确率提升8.56%。文章详细说明了移植过程,包括创建yolov13-DRB.yaml配置文件、修改tasks.py和__init__.py文件,以及引入UniRepLKNet模块的具体实现。其中重点描述了GRNwithNHWC、NCHWtoNHWC等核心组件的实现细节,并提供了完整的模型结构配置代码。这些改进使得YOLOv13模型在保持原有架构优势的同时,获得了更强大的特征提取

FJN110的博客 2819

北斗导航 | 卫星导航接收机原理(基础)

卡尔曼滤波,最小二乘,伪距,芯片,模组,接收机,捕获,跟踪,RTK,RTD,PPP,SPP,多普勒,DOP,灵敏度,热启动,冷启动,PNT,北斗发展,MEO,IGSO,GEO,ICD,导航电文,载波,载噪比

尘世冰封的专栏 2340

Spring 中,获取当前方法的类的代理对象有哪些方法?

在 Spring 框架中,获取代理对象是一个常见的需求,特别是在使用 AOP(Aspect-Oriented Programming)时。以下是几种常用的方法来获取代理对象:

KimSoft's Blog 1745

【AHE数据集】历史/未来全球网格热排放数据 PF-AHF

AHE数据集

WW、forever的博客 127

spring同类调用事务不生效-原因及三种解决方式

spring提供的声明式事务注解@Transactional,极大的方便了开发者管理事务,无需手动编写开启、提交、回滚事务的代码。 但是也带来了一些隐患,如果注解使用不当,可能导致事务不生效,最终导致脏数据也入库。 如果在同一个类直接调用事务方法,就会导致事务不生效,示例如下 public class StudentServiceImpl implements StudentService { @Autowired private StudentMapper studentMa.

hellozhxy的博客 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring 事务不生效?可能是内部调用惹的祸!

Spring 通过 AOP(面向切面编程)实现事务管理。当容器扫描到方法上有注解时,会为目标对象生成一个代理类。在代理类中,在目标方法调用前后分别执行事务的开启、提交或回滚等操作。事务传播行为Spring 定义了多种事务传播属性(如REQUIREDNESTED等),用于在多个事务方法相互调用时决定事务如何传播。Spring事务传播属性:1.propagation-required: 支持当前事务,如果有就加入当前事务中;如果当前方法没有事务,就新建一个事务;

i_YOLO的博客 3514

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Spring的事务 方法A调用方法B,事务是否失效

springboot的有事务方法调用没有方法的事务,事务是否失效?

lzq2357639195的博客 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

spring事务@Transactional在同一个类中的方法调用不生效

参考: https://www.jianshu.com/p/2e4e1007edf2 https://blog.youkuaiyun.com/ligeforrent/article/details/79996797 问题 也可以描述为 同一个类中,只有方法加了 @Transactional 事务为什么不生效? 类上加事务,方法不加事务,事务是生效的! 类上加事务,方法也加事务,事务是生效的!   ...

改变ing 2万+

解决@Transactional事务在类内部方法调用不生效

在默认情况下,大部分使用spring的事务都是使用代理的模式,代理实现的事务有一定的局限性:仅有在公有方法上标记的@Transactional有效;仅有外部方法调用过程才会被代理截获,事务才会有效,也就是说,一个方法调用本对象的另一个方法,没有通过代理类,事务也就无法生效。下面来说明下解决的方法 工具/原料 spring java 方法/步骤 1 首先描述下类内部方法互相调用,事务不生效的情况 UserService测试接口类 package cn.sw.study.

xiaokanfuchen86的博客 6141

spring service层方法调用同类中的方法 事务不生效?

有这样的一道面试题:在service层调用别的service层的方法,他们的事务能否生效;如果是在同一个类中调用带有@Transactional注解的方法,此时,他们的事务能否生效? 看了许多大神的blog,今天来做一下总结: 先给出大家答案: 不同类之间的方法调用,如类A的方法a()调用类B的方法b(),这种情况事务是正常起作用的。只要方法a()或b()配置了事务,运行中就会开启事务,产生代...

厚积薄发 1万+

spring事务方法调用不生效的场景

日常开发中,我们经常使用到spring事务。最近一位朋友去美团面试,被问了这么一道面试题:Spring 事务在哪几种情况下会不生效?今天田螺哥跟大家聊聊,spring事务不生效的15种场景。

zzy7075的专栏 1521

Spring嵌套事务之同一个类中,一个方法调用另外一个有事务的方法

前段时间,朋友问了我一个问题,说有一个service类中,有一个A()和B(), A()没有添加事务,B() 添加了一个默认的事务,那么如果B()抛出异常,那么A()B()是否会回滚? 今天就回顾以下这个问题,看看到底如何?回顾这个问题之前,需要先了解下事务的传播行为,事务的传播 行为共7种如下: PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务,最常见的选择。 PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行.

qq_33274797的博客 6242

Spring 事务管理:为什么内部方法调用事务不生效以及如何解决

摘要: Spring事务管理基于AOP代理机制,通过@Transactional注解实现。当同一类中的方法A调用方法B(均带事务注解)时,事务可能失效,因为内部调用未经过代理对象。解决方法:1)将方法B拆分到另一个类,通过依赖注入调用以触发代理;2)调整事务传播行为(仅对外部调用有效)。关键点在于Spring事务仅对代理对象的外部调用生效,内部直接调用会绕过代理导致事务失效。

Knight 865

Spring事务失效 -方法内部调用

文章 添加链接描述https://www.cnblogs.com/heqiyoujing/p/11221093.html

炫的博客 2万+

this调用自身方法,Transaction注解事务不生效的问题

起因:Spring的事务是通过代理类实现的,而下方代码中的this.addUserToDb()并没有走UserService的代理类,所以事务并不会生效。 解决思路: 调用UserService代理类的addUserToDb()方法 @Service public class UserService implements IUserService { @Autowired private UserMapper userMapper; @Override public Lo

牙刷冰冰的博客 5561

Spring service调用当前类方法导致事务不生效

最近在项目中遇到一个问题,在service类中调用当前类的一个方法,没有开启事务,如下: @Service("userService") public class UserServiceImpl implements UserService{ @Autowired private UserMapper userMapper; //默认情况下Spring的声明式事务对所有的运行时异常进...

uk8692的专栏 2044

Spring同一个Service类非事务方法调用事务方法事务失效解决方案

今天看到线上异常,根据异常排查了相关落库存储的数据,然后进而排查相关业务Service中逻辑代码,事务方法中对A、B、C三张表调用其相关Service依次插入记录。但是B插入失败,A表插入记录并没有事务回滚。然后排查了一下业务代码逻辑,发现在一个Service中,一个非事务方法调用事务方法导致的事务并没有生效导致的。

秋夜无霜 5776
上一篇: Collections.addAll和Stream方式将数组转List速度对比
下一篇: IDEA中TODO以及FIXME等关键字不高亮显示修复
try_learner
博客等级 码龄9年 35粉丝 44原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值