Spring 内部方法调用失效问题(AOP)
AOP
使用的是动态代理的机制,它会给类生成一个代理类,事务的相关操作都在代理类上完成。内部方式使用this
调用方式时,使用的是实例调用,并没有通过代理类调用方法,所以会导致事务失效。
解决办法
方式一 引入自身bean对象
在类的内部@AutoWired将本身的bean注入,然后通过注入的bean调用方法,从而实现使用AOP代理的操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //注入自身bean @Autowired @Lazy private ****Service service; //通过service调用自身方法 public void invoke(){ //this.execute(); //使用注入对象替代this调用 service.execute(); } |
方式二 通过ApplicationContext引入bean对象
通过ApplicationContext获取bean,通过bean调用内部方法,就使用了bean的代理类。
1 2 3 4 5 6 7 8 | @Autowired private ApplicationContext applicationContext; //通过applicationContext获取bean对象 public void incoke(){ ((****Service)applicationContext.getBean( "****Service" )).execute(): } |
方式三 引入AopContext获取当前类的代理类
通过AopContext获取当前类的代理类,直接通过代理类调用方法。
1 2 3 4 5 6 7 8 | //在引导类上添加该注解 @EnableAspectJAutoProxy (exposeProxy= true ) public void invoke(){ ((***Service)AopContext.currentProxy()).execute(); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端