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

  

 

posted @ 2020-05-29 15:33  梦里前进  阅读(1273)  评论(0编辑  收藏  举报