Spring事务原理源码讲解

1、讲Spring事务前先讲一下Aop,因为Spring事务就是Aop的 运用:

  Aop是啥?面向切面编程,我看到这个词,反正一脸蒙蔽。我就用实际情况来说Aop吧,Aop就是对一个类中的方法进行增强

  如何实现增强呢?我生成一个代理类,这个代理类中包含了被代理的方法,再写上想要增强的内容方法,那么我在操作代理类

       其实就可以达到增强的效果,所以归根结底就是我要生成一个带有增强属性或方法的代理类,这个过程我们就简单理解为Aop。

2、开启Aop  看  @EnableAspectJAutoProxy 

  会注册进来一个类     AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);

  AnnotationAwareAspectJAutoProxyCreator.class 这个类很关键。

3、开启事务 看  @EnableTransactionManagement 

@Override
	protected String[] selectImports(AdviceMode adviceMode) {
		switch (adviceMode) {
			case PROXY:
				return new String[] {AutoProxyRegistrar.class.getName(),
						ProxyTransactionManagementConfiguration.class.getName()};
			case ASPECTJ:
				return new String[] {determineTransactionAspectClass()};
			default:
				return null;
		}
	}

  这个注解最终会将上面数组中的类变成beandefination ,最后也是会实例化。

4、ProxyTransactionManagementConfiguration.class 这个类

@Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME)
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() {
		BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor();
		advisor.setTransactionAttributeSource(transactionAttributeSource());
		//设置通知类
		advisor.setAdvice(transactionInterceptor());
		if (this.enableTx != null) {
			advisor.setOrder(this.enableTx.<Integer>getNumber("order"));
		}
		return advisor;
	}

  创建事务切面,此bean的类型是关键,可以看到最终是实现了advisor。

5、结合上一篇文章知道,实现aop其中一个方法就是实现advisor 接口,所以在每一个bean实例化的最后,

if (mbd == null || !mbd.isSynthetic()) {
			//这个地方可能生出代理实例,是aop的入口
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}

  这个方法中会拿到合格的切面,然后挨个和当前bean进行匹配,所谓匹配就是使用收集的advisor中的pointcut对象进行match调用

如果符合就会把当前advisor认为是需要调用的增强,最终会包装进代理类中。从而真实类实例化结束后,返回一个代理实例。

具体执行过程暂时不分析了。

原文地址:https://www.cnblogs.com/zxg-blog/p/15099212.html