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