zoukankan      html  css  js  c++  java
  • 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认为是需要调用的增强,最终会包装进代理类中。从而真实类实例化结束后,返回一个代理实例。

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

  • 相关阅读:
    2.socket编程
    1网络编程基础概念
    vim笔记
    mysql示例及练习2
    mysql的示例及练习
    自己封装的mysql应用类示例
    mysql3_pymysql
    mysql2
    mysql1
    python之列表与集合
  • 原文地址:https://www.cnblogs.com/zxg-blog/p/15099212.html
Copyright © 2011-2022 走看看