1.自动加载 spring.factories 的文件
加载事务的启动配置类
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
加载类配置
DataSourceTransactionManagerAutoConfiguration
类图如下
并开启事务配置
EnableTransactionManagementConfiguration
Springboot 配置文件
spring-configuration-metadata.json
spring.aop.proxy-target-class 默认为true
{
"name": "spring.aop.auto",
"type": "java.lang.Boolean",
"description": "Add @EnableAspectJAutoProxy.",
"defaultValue": true
},
{
"name": "spring.aop.proxy-target-class",
"type": "java.lang.Boolean",
"description": "Whether subclass-based (CGLIB) proxies are to be created (true), as opposed to standard Java interface-based proxies (false).",
"defaultValue": true
}
2.开启事务管理器
@EnableTransactionManagement
导入事务管理器配置
导入2个类, 分别为:
AutoProxyRegistrar.class.,ProxyTransactionManagementConfiguration.class
2.1 AutoProxyRegistrar.class
AopConfigUtils 中与一个判断,BeanDefinitionRegistry定义中是否存在名字为
AUTO_PROXY_CREATOR_BEAN_NAME =
"org.springframework.aop.config.internalAutoProxyCreator" class=InfrastructureAdvisorAutoProxyCreator的BeanDefinition。如果没有则添加。有则根据顺序替换class
InfrastructureAdvisorAutoProxyCreator 类图如下, 属于bean 的处理器,用于ioc 容器创建bean 实例操作。
实际上BeanDefinitionRegistry 已经存在 一个beanName 为AUTO_PROXY_CREATOR_BEAN_NAME =
"org.springframework.aop.config.internalAutoProxyCreator"。则class= AnnotationAwareAspectJAutoProxyCreator
问:AnnotationAwareAspectJAutoProxyCreator 什么时候被注册到BeanDefinitionRegistry呢?
答:可以看一下aop的自动配置。
AnnotationAwareAspectJAutoProxyCreator 的类图如下
后置处理器代码,创建aop 代理对象
3. ProxyTransactionManagementConfiguration
类图如下
定义了3个bean, 类型分配为 BeanFactoryTransactionAttributeSourceAdvisor, AnnotationTransactionAttributeSource, TransactionInterceptor
BeanFactoryTransactionAttributeSourceAdvisor类图如下
AnnotationTransactionAttributeSource 类图如下
TransactionInterceptor 类图如下
4 在aop 的后置处理器的处理逻辑AbstractAutoProxyCreator 中
会将BeanFactoryTransactionAttributeSourceAdvisor 从ioc 容器中获取, 并在createProxy的方法中生成Advisor中,设置ProxyFactory 实例中
注意:ProxyFactory 并不是一个工厂, 根据一下类图,是一个配置类
5 最终CglibAopProxy(我的代理是cglib方式)创建代理对象, 中间获取到了,对事务的拦截器
最终方法getCallbacks(rootClass),会将类DynamicAdvisedInterceptor 拦截器登,加入其中到enhancer中,并返回代理对象。当访问代理对象时,则会调用DynamicAdvisedInterceptor 的intercept 的方法,在intercept()中获取拦截器链。 并将拦截器链如放入到 CglibMethodInvocation,并执行拦截器链。
CglibMethodInvocation 类图如下
事务拦截器也会在此被调用。
会调用TransactionInterceptor 中的方法进行处理。
由于篇幅原因,事务细节,下一篇说明