声明式事务实现原理了解吗?

就是通过 AOP/动态代理实现的。

  • 在 Bean 初始化阶段创建代理对象:在 Spring 容器初始化每个单例 Bean 的过程中,会遍历容器中的所有 BeanPostProcessor 实现类,并执行它们的 postProcessAfterInitialization 方法。其中,AbstractAutoProxyCreator 类的 postProcessAfterInitialization 方法会遍历容器中所有的切面,寻找与当前实例化的 Bean 匹配的切面。如果找到了与目标 Bean 匹配的切面,就会创建一个代理对象。默认情况下,如果目标类实现了接口,则使用 JDK 动态代理创建代理对象;如果目标类没有实现接口,则使用 Cglib 动态代理创建代理对象。
  • 在执行目标方法时进行事务增强操作:当通过代理对象调用 Bean 的方法时,会触发对应的 AOP 增强拦截器。对于声明式事务,它是一种环绕增强,对应的接口是 MethodInterceptor。事务增强的具体实现是 TransactionInterceptor。在方法调用前后,TransactionInterceptor 会在事务管理器的支持下启动一个事务,并根据事务属性进行事务的提交或回滚操作。

spring-97493c7f-c596-4e98-a6a8-dab254d6d1ab.png

事务拦截器TransactionInterceptorinvoke方法中,通过调用父类TransactionAspectSupportinvokeWithinTransaction方法进行事务处理,包括开启事务、事务提交、异常回滚。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题