- 首先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无法替换被代理类已经被载入的字节码