事务在Aop中的流程

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  中的方法进行处理。

由于篇幅原因,事务细节,下一篇说明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值