Spring事务与JDK/CGLIB动态代理

  • 首先Spring事务在开发过程中是通过@Transactional注解来控制。

1. Transactional注解的原理

  • 对于使用了Transactional注解的方法的类,Spring AOP代理会在运行时生成这个类的代理对象。
  • 当这个对象运行这个注解方法时,会读取@Transactional注解里面配置的信息,决定该方法是否要使用TransactionInterceptor拦截器来拦截。
  • 当拦截器拦截该方法时,会在调用该方法之前,创建事务,并在这个事务中执行该方法,最后根据执行是否有异常使用抽象事务管理器(AbstractPlatformTransactionManager)操作数据源提交或者回滚这个事务。
  • 它本质使用一个事务拦截器,在方法调用的前后/周围进行事务性增强(advice),来驱动事务完成。也就是在业务方法外边通过Spring AOP包上一层事务管理器的代码(即插入切面),这是Java设计模式中常见的通过代理增强被代理类的做法。

2. JDK 和 CGLib动态代理区别

Spring AOP的底层有2种实现:JDK动态代理、CGLIB。

  • 前者的原理是JDK反射,并且只支持Java接口的代理;
  • 后者的原理是继承(extend)与覆写(override),因此能支持普通的Java类的代理。两种方式都是动态代理,即运行时实时生成代理。

由于JVM的限制,CGLIB无法替换被代理类已经被载入的字节码

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值