spring 事务的实现

事务的实现需要的配置

1.需要事务管理器

2.事务aop相关配置

2.事务aop相关配置

需要通知器 ( 切入点 +  通知)         spring aop必备的

事务切入点PointCut : 匹配操作,主要是判断方法是否加上了事务@Transactional注解等一些判断 

事务通知Advice: 执行代理对象的方法的时候执行的事务相关的通知操作

事务通知器Advisor: 事务切入点和事务通知的绑定

通知器advisor 的作用 : 

                                        获取切入点

                                getPointcut()

                                          获取通知

                                 getAdvice() 

源码分析

首先肯定是看开启事务管理的注解,里面都配置了事务管理需要的相关类信息

@EnableTransactionManagement 启动事务管理的注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({TransactionManagementConfigurationSelector.class})
public @interface EnableTransactionManagement {
    boolean proxyTargetClass() default false;

    AdviceMode mode() default AdviceMode.PROXY;

    int order() default 2147483647;
}
@Import({TransactionManagementConfigurationSelector.class})

进入TransactionManagementConfigurationSelector类

 进入

ProxyTransactionManagementConfiguration类

可以看到和我们上面说的一样,首先创建事务的通知器

BeanFactoryTransactionAttributeSourceAdvisor

advisor.setAdvice(this.transactionInterceptor());

 接下来重点就是 事务的通知器里面的切入点 和 通知的如何实现了;

BeanFactoryTransactionAttributeSourceAdvisor 通知器
TransactionInterceptor        通知
TransactionAttributeSourcePointcut        切入点

1.进入aop后置处理器的后置方法 (事务基于aop实现的)

this.wrapIfNecessary(bean, beanName, cacheKey);

Object[] specificInterceptors = this.getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, (TargetSource)null);

List<Advisor> candidateAdvisors = this.findCandidateAdvisors();

 从bean工厂里面找到所有的通知器对象       : candidateAdvisors

List<Advisor> eligibleAdvisors = this.findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName); 

如果匹配的话,就放入通知器列表中

eligibleAdvisors.add(candidate);

canApply(Advisor advisor, Class<?> targetClass, boolean hasIntroductions)

 

 进行切入点里面的匹配的判断了

        肯定要判断该方法是不是我们需要切入的方法拉,"所以事务这里主要是判断方法上面有没有加事务的注解 ",如果对象  有一个方法加了事务的注解, 这里匹配成功,返回true,就会加入通知器列表,aop后置处理器里面就会进行代理

 

 

 

tas.getTransactionAttribute

 

 

 进行代理对象的创建 (spring 我的版本默认使用的是cglib进行代理的

通知Advice的调用

当调用事务方法的时候,就会进入代理对象的

intercept方法中

List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);

 

 

 如果已经是 

MethodInterceptor 类型 就直接add

下面的while是进行适配器--这里就先不管

接下来的重点就是把上面获取到的通知 进行执行了

链式 调用

 

this.invokeWithinTransaction(var10001, targetClass, invocation::proceed)

 递归调用,继续调用process方法

 完毕!!!!

事务aop就是这样完成的!!!!!!!!

总结

aop  1. 进行方法的切入 ,所以需要切入点 和 通知  

Advice:通知,标识逻辑织入的位置,常见的有BeforeAdvice,AfterAdvice等。


PointCut:切入点,

                        1.标识对什么方法进入代理,常见的有JdkRegexpMethodPointcut根据正则表达式选取切入点,NameMatchMethodPointcut根据方法名选择切入点。

                        2.判断该方法是否需要织入逻辑


Advisor:通知器,是通知与切入点的集合。

通知器 Advisor 是由切入点 PointCut 和通知 Advice 构成的 

aop 2.动态代理 , 返回代理对象,执行 定义的通知

 通过aop注册的后置处理器,当bean对象生命周期执行到 bean的后置处理器的时候, 就会进入aop的后置方法 :  

                1.获取bean工厂里面的通知器对象

                2. 判断当前bean对象的方法是否有匹配的通知器(切入点里面进行匹配);

                3.如果当前bean对象有通知器列表 -> 动态代理

                        3.1 返回代理对象了,那肯定要执行通知了,

                        3.2 执行通知

                4.如果当前bean对象没有通知器列表 直接返回当前bean对象

所以事务的实现

        肯定就是需要通知器:切入点 + 通知了

下面说一下 Advice 和Interceptor 的关系

 所以这里为啥可以直接把 

TransactionInterceptor 设置到通知里面

在进行链式调用的时候, spring做了一个转换,把Advice 转为了Interceptor进行调用,

就是上面说的适配器

 

事务 这里是直接 实现

MethodInterceptor接口

所以就直接调用即可!!!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值