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