Spring事务代理机制总结:
1、Spring声明式事务的底层是怎么实现的?
- 通过Spring中的代理,那在Spring中生成代理的方式有几种?
两种,JDK动态代理和CGLIB
JDK动态代理只能用于带接口的,CGLIB则带不带接口都行(通过继承)
2、假如有个接口,它包含两个方法a和b,然后有一个类实现了该接口。在该实现类里在a上标上事务注解、b上不标,此时事务是怎样的?
a标注解了,肯定有事务,b没有注解,所以没有事务。
那假设在方法b里调用方法a,其它保持不变,此时再调用方法b,会有事务吗?
image.png也不会,因为动态代理类中没有加事务注解的方法都不会进行增强,就算调用了目标类其他准备增加的方法。(见demo1)
3、对于没有实现接口的类,只能使用CGLIB来生成代理。假设有这样一个类,它里面包含public方法,protected方法,private方法,final方法,static方法,我都给它们加上事务注解,哪些方法会有事务呢?
CGLIB确实是按照这种方式生成了子类作为代理,而且和父类在同一个包下。不过Spring选择让protected方法和package方法不支持事务,所以只有public方法支持事务。
Demo1
Github代码地址:Spring事务-代理增强
网友评论