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();
}

  

 

posted @   梦里前进  阅读(1303)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示