Spring声明式事务实现的原理
Spring的声明式事务管理是通过AOP(面向切面编程)和代理机制实现的。
第一步,在Bean初始化阶段创建代理对象
- Spring容器在初始化单例Bean的时候,会遍历所有
BeanPostProcessor实现类(BeanPostProcessor 是 Spring 提供的一个扩展接口,允许在 Bean 实例化、依赖注入和初始化之后,添加自定义的处理逻辑。它定义了两个方法:),并执行postProcessAfterInitialization方法。 - 在执行
postProcessAfterInitialization方法时会遍历容器中所有的切面,查找与当前Bean匹配的切面,获取事务的属性切面,也就是@Transactional注解及其属性值。 - 然后根据得到的切面,创建一个代理对象,默认使用JDK动态代理创建代理,如果目标类是接口,则使用JDK动态代理,否则使用Cglib。
第二步,在执行目标方法时进行事务增强操作
当通过代理对象调用Bean方法的时候,会触发对应的AOP增强拦截器,声明式事务是一种环绕增强,对应接口为MethodInterceptor,事务增强对该接口的实现为TransactionInterceptor,
事务拦截器TransactionInteceptor在invoke方法中,通过调用父类TransactionAspectSupport的invokeWithinTransaction方法进行事务管理,
包括开启事务、事务提交、异常回滚等。

浙公网安备 33010602011771号