@EnableTransactionManagement
1,通过@Import 引入了TransactionManagementConfigurationSelector类。
2,TransactionManagementConfigurationSelector继承了AdviceModeImportSelector类,同时还去实现了selectImports方法,返回结果为类的权限类名
3,通过查阅相关资料会进入到case Proxy中,这而会去返回两个类:AutoProxyRegistrar.class, ProxyTransactionManagementConfiguration.class。分开来看两个类
A,AutoProxyRegistrar:
这个类 实现了ImportBeanDefinitionRegistrar接口,实现方法上单独的去看的话,视乎是去做了一些类注册相关的方法。而该方法中通过registerAutoProxyCreatorIfNecessary方法去注册了一个新的类。
点进去查看注册的是InfrastructureAdvisorAutoProxyCreator类,这个类又继承了AbstractAdvisorAutoProxyCreator类,继续点进去其又继承了AbstractAutoProxyCreator类,而这个类Spring AOP 代理对象创建流程源码剖析有做过分析,为后置处理器类。
B,ProxyTransactionManagementConfiguration
首先可以明确该类为一个Spring容器配置注解类,该类一共有三个方法,主要用于对Spring容器中注入类
第一个方法:transactionAdvisor(事务增强器)
第二个方法:transactionAttributeSource(属性解析器),其内部持有一个事务注解的解析器集合,该集合的存放有三个实现类解析器,具体使用的是SpringTransactionAnnotaionParser。进入到该类中可以发现该类方法用来解析@Trasactional事务的属性
第三个方法:transactionInterceptor(事务拦截器),实际上使用了MethodInterceptor,从命名上来看应该是一个方法的拦截接口。根据之前的AOP剖析时有提到过,会在代理对象创建之前对增强和拦截器进行合并,所以这里对于代理而言又是一层横切逻辑。
既然说是横切逻辑,对于代理自然会有一个invoke执行方法,而invokeWithinTransaction方法则为重要的执行事务的横切逻辑的方法。
☆ invokeWithinTransaction方法