Spring 内部方法调用失效问题(AOP)

时间:2023-03-09 13:26:57
Spring 内部方法调用失效问题(AOP)

AOP使用的是动态代理的机制,它会给类生成一个代理类,事务的相关操作都在代理类上完成。内部方式使用this调用方式时,使用的是实例调用,并没有通过代理类调用方法,所以会导致事务失效。

解决办法

方式一 引入自身bean对象

在类的内部@AutoWired将本身的bean注入,然后通过注入的bean调用方法,从而实现使用AOP代理的操作。

//注入自身bean

@Autowired
@Lazy
private ****Service service; //通过service调用自身方法 public void invoke(){
//this.execute();
//使用注入对象替代this调用
service.execute();
}

  

方式二 通过ApplicationContext引入bean对象

通过ApplicationContext获取bean,通过bean调用内部方法,就使用了bean的代理类。

@Autowired
private ApplicationContext applicationContext; //通过applicationContext获取bean对象
public void incoke(){
((****Service)applicationContext.getBean("****Service")).execute():
}

  

方式三 引入AopContext获取当前类的代理类

通过AopContext获取当前类的代理类,直接通过代理类调用方法。

//在引导类上添加该注解
@EnableAspectJAutoProxy(exposeProxy=true) public void invoke(){
((***Service)AopContext.currentProxy()).execute();
}