Spring事务代理机制总结(含代码Demo)

2019-04-07  本文已影响0人  longxingxiu

Spring事务代理机制总结:

1、Spring声明式事务的底层是怎么实现的?

两种,JDK动态代理和CGLIB

JDK动态代理只能用于带接口的,CGLIB则带不带接口都行(通过继承)

2、假如有个接口,它包含两个方法a和b,然后有一个类实现了该接口。在该实现类里在a上标上事务注解、b上不标,此时事务是怎样的?

a标注解了,肯定有事务,b没有注解,所以没有事务。

那假设在方法b里调用方法a,其它保持不变,此时再调用方法b,会有事务吗?

也不会,因为动态代理类中没有加事务注解的方法都不会进行增强,就算调用了目标类其他准备增加的方法。(见demo1)

image.png
3、对于没有实现接口的类,只能使用CGLIB来生成代理。假设有这样一个类,它里面包含public方法,protected方法,private方法,final方法,static方法,我都给它们加上事务注解,哪些方法会有事务呢?

CGLIB确实是按照这种方式生成了子类作为代理,而且和父类在同一个包下。不过Spring选择让protected方法和package方法不支持事务,所以只有public方法支持事务。

Demo1

Github代码地址:Spring事务-代理增强

上一篇下一篇

猜你喜欢

热点阅读