奔跑吧,JAVA!

Spring Boot笔记

2018-12-05  本文已影响0人  凌风x

时间:2018.12.05

记录一些spring和spring boot中的一些常见技巧或隐藏问题

1.@transactional注解隐藏的问题

 @Transactional//事务A
    public boolean action_A(){
         action_B();//调用事务B
        return false;
    }
    @Transactional//事务B
    public boolean action_B(){
        return false;
    }

在一个事务中直接调用另一个事务,此时事务便会失效。
原因:由于事务是基于spring AOP 操作的,而AOP又是基于动态代理实现。而动态代理的实现就要求,每次调用方法必须通过代理调用方法,而不能直接调用方法。如果直接调用方法,那么AOP的各种特性也就消失了。

解决方法:

第一步: 修改spring配置文件XML增加语句(先开启cglib代理,然后开启exposeProxy=true ,向外暴露代理对象):

 <aop:aspectj-autoproxy proxy-target-class="true" expose-proxy="true">

第二步:使用ApoContext获取对象的动态代理

AopContext.currentProxy();

完整代码:

public class TempImpl implements TempInterface{


 @Transactional//事务A
 @Override
    public boolean action_A(){
   TempInterface  tempInterface=(TempInterface)AopContext.currentProxy();//获取当前动态代理
        tempInterface.action_B();//调用事务B
        return false;
    }
  @Transactional//事务B
  @Override
    public boolean action_B(){
        return false;
    }

}

至此解决

2.loading...

上一篇 下一篇

猜你喜欢

热点阅读