Spring声明式事务的实现方式选择(JDK动态代理与cglib)

时间:2021-01-01 04:25:14
  • 1、简介

Spring声明式事务的具体实现方式是动态决定的,与具体配置、以及事务代理对象是否实现接口等有关。

  • 2、使用JDK动态代理的情况

在满足下面两个条件时,Spring会选择JDK动态代理作为声明式事务的实现方式。

(1)事务代理类必须实现接口且不能显式继承父类(Object这个父类不算)。

(2)配置:springboot的启动类要加上@EnableTransactionManagement和@EnableAspectAutoProxy注解,且其中的proxyTargetClass属性要为默认的fasle,如果设置成了true就会开启cglib。

注意:

在这种情况下,@Transcation注解可以加在事务代理对象所实现的接口的方法上,也可以加在具体的实现类上。

  • 3、使用cglib的情况

除了上述情况,Spring 会采用cglib方式来实现声明式事务。

(1)比如业务类未实现接口。

(2)proxyTargetClass=true时。

当然,在这种情况下,@Transcation注解只能加在具体的实现类上。

由于Spring事务的具体实现方式未知,因此推荐把注解加在实现类上,不然会带来很多的问题。