大家好,我是磊哥。
Transactional注解简介Transactional是spring中声明式事务管理的注解配置方式,相信这个注解的作用大家都很清楚。Transactional注解可以帮助我们把事务开启、提交或者回滚的操作,通过aop的方式进行管理。通过
Transactional注解就能让spring为我们管理事务,免去了重复的事务管理逻辑,减少对业务代码的侵入,使我们开发人员能够专注于业务层面开发。我们知道实现Transactional原理是基于springaop,aop又是动态代理模式的实现,通过对源码的阅读,总结出下面的步骤来了解实际中,在spring是如何利用aop来实现Transactional的功能的。spring中声明式事务实现原理猜想首先,对于spring中aop实现原理有了解的话,应该知道想要对一个方法进行代理的话,肯定需要定义切点。在
Transactional的实现中,同样如此,spring为我们定义了以Transactional注解为植入点的切点,这样才能知道Transactional注解标注的方法需要被代理。有了切面定义之后,在spring的bean的初始化过程中,就需要对实例化的bean进行代理,并且生成代理对象。
注意文末有:页互联网大厂面试题生成代理对象的代理逻辑中,进行方法调用时,需要先获取切面逻辑,
Transactional注解的切面逻辑类似于Around,在spring中是实现一种类似代理逻辑。Transactional作用根据上面的原理猜想,下面简单介绍每个步骤的源码以进行验证。
首先是
Transactional,作用是定义代理植入点。中,分析知道代理对象创建的通过BeanPostProcessor的实现类AnnotationAwareAspectJAutoProxyCreator的postProcessAfterInstantiation方法来实现个,如果需要进行代理,那么在这个方法就会返回一个代理对象给容器,同时判断植入点也是在这个方法中。那么下面开始分析,在配置好注解驱动方式的事务管理之后,spring会在ioc容器创建一个BeanFactoryTransactionAttributeSourceAdvisor实例,这个实例可以看作是一个切点,在判断一个bean在初始化过程中是否需要创建代理对象,都需要验证一次BeanFactoryTransactionAttributeSourceAdvisor是否是适用这个bean的切点。如果是,就需要创建代理对象,并且把BeanFactoryTransactionAttributeSourceAdvisor实例注入到代理对象中。
其中知道在AopUtils#findAdvisorsThatCanApply中判断切面是否适用当前bean,可以在这个地方断点分析调用堆栈,AopUtils#findAdvisorsThatCanApply一致调用,最终通过以下代码判断是否适用切点。
AbstractFallbackTransactionAttributeSource#