@Transactional标注到interface的方法上,然后事务代理使用CGLIB,事务可以生效么?

laoxilaoxi 发布于 2019/08/28 17:28
阅读 572
收藏 0

MySQL连接为什么挂死了?别踩坑!>>>

一直以来,都认为该情况事务是不生效的,因为CGLIB基于继承做的代理,需要将@Transactional标注到实现类的方法上才可以,但是最近在一个项目debug的时候发现@Transactional标注在interface方法上,然后通过@Autowired引入该bean,发现其CGLIB代理内部有事务增强,大致如下

public interface TestServicei {
    @Transactional
    String save(String params);
}

@Service
public class TestService implements TestServicei{
    @Override
    public String save(String params){
        System.out.println("save params-->"+params);
        return params;
    }
}

@Controller
public class Test {

    @Autowired
    private TestServicei testServicei;
    @RequestMapping("/test")
    @ResponseBody
    public String test(@RequestParam("params") String params){
        //在此处DEBUG
        return "hashCode:"+testServicei.save(params);
    }
}

DEBUG看到的如下

 

看到这里比较迷惑了,感觉像是有事务增强的,不知道哪里理解错了?求大佬帮忙解惑一下。

环境:Springboot2.0.5  Spring-tx5.1.4 aspectjweaver与aspectjtools为1.5.4

加载中
0
妹子楼顶有鸽子
妹子楼顶有鸽子
SpringTransactionAnnotationParser.parseTransactionAnnotation --> AnnotatedElementUtils.findMergedAnnotationAttributes --> 
AnnotatedElementUtils.searchWithFindSemantics

  有@Transactional注解,会从本身(类,方法)的注解,桥接方法注解,父类,接口从查找

 

 

laoxilaoxi
laoxilaoxi
也就是说,该情况下,该注解是可以读取到的,事务是生效的?不知道理解的对不对
返回顶部
顶部