相关阅读
@Transactional 与@EnableTransactionManagement的使用及源码分析(一)
1.声明事务的源码分析
[1] @EnableTransactionManagement注解开启事务管理器
[2]注册AutoProxyRegistrar和ProxyTransactionManagementConfiguration
[3] 核心组件InfrastructureAdvisorAutoProxyCreator注册
下面我们将对如何找到AutoProxyRegistrar和ProxyTransactionManagementConfiguration这两个类,以及AutoProxyRegistrar背后对于InfrastructureAdvisorAutoProxyCreator的实现进行说明
2.探索一下相关的核心类
(1)点击该注解进入
(2)这个类下面通过
1)@Import(TransactionManagementConfigurationSelector.class)引入了一个事务管理器,点击进入查看
2)AdviceMode.PROXY; 默认定义的模型,对于后面判断有用
(3)该类下声明了我们事务中的两个主要的类是对我们的AutoProxyRegistrar和ProxyTransactionManagementConfiguration进行注册,接下来我们先对AutoProxyRegistrar进行分析(这个类最后是生成我们的核心类InfrastructureAdvisorAutoProxyCreator,下面进行详细说明)
3.对AutoProxyRegistrar的解析
(1)该方法主要是取的我们相关的注解类
(2)继续点击进入registerAutoProxyCreatorIfNecessary()的方法
(3)继续点击registerAutoProxyCreatorIfNecessary()方法
(4)在这里的InfrastructureAdvisorAutoProxyCreator就是我们事务相关的核心类之一
(5)点击进入registerOrEscalateApcAsRequired( )该方法
(6)这里先通过判断我们上面定义的核心类InfrastructureAdvisorAutoProxyCreator是否有相关的bean id,如果有则直接进行相关设置;但很明显这是第一次创建,所以它返回的是null,然后继续执行下面的注册方法
4.InfrastructureAdvisorAutoProxyCreator的补充说明:
(1)根进这个InfrastructureAdvisorAutoProxyCreator类的时候,它有很多层继承关系,下图是它最终的继承关系图。
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
[1] ProxyProcessorSupport 它是实现了Ordered接口的
[2]它的处理器SmartInstantiationAwareBeanPostProcessor最终实现的接口是BeanPostProcessor,但其实它的前,后置处理器的方法是在InstantiationAwareBeanPostProcessor上实现的
[3]简单说明一下InfrastructureAdvisorAutoProxyCreator这个类其实是我们的处理器相关的类,也就是产生我们对应事务处理器的处理方法,但是它并没有和我们加了@Transactional这个注解的事务类进行相关联。后面我们将会介绍它是如何通过ProxyTransactionManagementConfiguration这个类作为桥梁把我们普通的事务bean与相应的处理方法关联其来的。
InfrastructureAdvisorAutoProxyCreator对于我们事务的作用:
1)注册
2)利用后置处理器机制创建以后,返回一个代理对象(增强),代理对象执行方法时,利用拦截器进行调用
小结:
从上面的AutoProxyRegistrar类中相应的方法跟到最后,我们可以发现该类主要作用是生成的类InfrastructureAdvisorAutoProxyCreator,相应的bean id 为org.springframework.aop.config.internalAutoProxyCreator;不过这里只是进行了相应的注册,还没有实现创建过程,它的创建与AOP核心类AnnotationAwareAspectJAutoProxyCreator十分类似