Spring Aop与声明式事务

1.对某实现BeanDefinition的对象,先实例化,后经过属性填充。

2.DefaultListableBeanFactory对象的initializeBean(...)方法中。

3.调用实现BeanPostProcessor接口的AnnotationAwareAspectJAutoProxyCreator类对象的postProcessAfterInitialization(...)

public class AnnotationAwareAspectJAutoProxyCreator {
    
    //解决代理对象的循环依赖
    //将其放入三级缓冲中,对某对象进行赋值操作后调用getEarlyBeanReference()
    //方法将代理对象提前暴露处理,等到该实例对象通过AnnotationAwareAspectJAutoProxyCreator类 
    //创建代理时,发现earlyProxyReferences存在对象名称,就直接返回代理对象 
    private final Set<Object> earlyProxyReferences;
    
    //存放代理对象的字节码
    private final Map<Object, Class<?>> proxyTypes;
    
    //存放可以被代理的对象
    private final Map<Object, Boolean> advisedBeans;


    //通过实例化对象创建代理对象
    public Object postProcessAfterInitialization() {
        if (bean != null) {
            Object cacheKey = this.getCacheKey(bean.getClass(), beanName);
            
            //如果之前没有创建过该实例化对象,则调用wrapIfNecessary()方法创建
            //代理对象
            if (!this.earlyProxyReferences.contains(cacheKey)) {
                return this.wrapIfNecessary(bean, beanName, cacheKey)->{
                   //得到实例化bean的advices和Advisor
                   Object[] specificInterceptors = this.getAdvicesAndAdvisorsForBean(..);
                   
                   // specificInterceptors大于0,则创建代理对象,执行下面的语句
                   //存放可以能被代理的对象
                   this.advisedBeans.put(cacheKey, Boolean.TRUE);
                   //创建代理对象, 通过advisor|.class|beanName|被填充属性的实例化对象
                   Object proxy = this.createProxy(specificInterceptors,...);
                   };
                    
                   //存放代理对象的字节码
                   this.proxyTypes.put(cacheKey, proxy.getClass());
                   
                   return proxy;
                }
                 
            }
        }

        return bean;
    }    

}

4.在创建createProxy(specificInterceptors,...)方法中


  //创建proxyFactory,其属性
  // aopProxyFactory= new DefaultAopProxyFactory(); 根据该类创建代理对象。
  // targetSource 存放对象的实例(为属性赋值);
  // advisorChainFactory = new DefaultAdvisorChainFactory();
  // advisors 初始化Advisor
  // interfaces 接口数组
  //  1.@Aspect
  //    Advisor的实现类InstantiationModelAwarePointcutAdvisorImpl
  //                 其属性有pointcut,instantiatedAdvice有AspectJAfterThrowingAdvice
  //                 AspectJAfterReturningAdvice,AspectJAfterAdvice,AspectJAroundAdvice
  //                 AspectJMethodBeforeAdvice
  //    Advisor的实现类ExposeInvocationInterceptor 
  //                 其属性advice ExposeInvocationInterceptor 
  //  2.@Transactional 
  //    Advisor的实现类BeanFactoryTransactionAttributeSourceAdvisor
  //                  其属性pointcut, advice =TransactionInterceptor ,beanFactory   

Object createProxy(specificInterceptors,...){
      
    ProxyFactory proxyFactory = new ProxyFactory();
    
    // 初始化proxyFactory对象
    
    return proxyFactory.getProxy(this.getProxyClassLoader())->{
        return this.createAopProxy().getProxy(classLoader)->{
            // DefaultAopProxyFactory对象.createAopProxy(this)
            return this.getAopProxyFactory().createAopProxy(this).getProxy(classLoader)->        
            {
                // 创建jdk动态代理,config为ProxyFactory对象
                // 代理对象名字$Proxy23
                // 接口InvocationHandler.invoke(...)的实现类
                // JdkDynamicAopProxy类
                return new JdkDynamicAopProxy(config).getProxy(classLoader);
                // 创建cglib代理
                //   属性advised=ProxyFactory
                return new ObjenesisCglibAopProxy(config).getProxy(classLoader)->{
                    // 获取目标类
                    Class<?> rootClass = this.advised.getTargetClass();

                    Enhancer enhancer = this.createEnhancer();
                    enhancer.setClassLoader(classLoader);
                    enhancer.setSuperclass(rootClass);
                    enhancer.setInterfaces(...)//SpringProxy|Advised
                    
                    // 7个回调。callbacks[0]=CglibAopProxy$DynamicAdvisedInterceptor
                    //       其实现接口MethodInterceptor.intercept(...) 
                    Callback[] callbacks = this.getCallbacks(rootClass);
                    enhancer.setCallbackFilter(...);
                    enhancer.setCallbackTypes(types);
                    return this.createProxyClassAndInstance(enhancer, callbacks)->{
                        //生成 类名$$EnhancerBySpringCGLIB$$8b69cafc
                        Class<?> proxyClass = enhancer.createClass();
                        Constructor<?> ctor = proxyClass.getDeclaredConstructor();
                        proxyInstance= ctor.newInstance(this.constructorArgs);
                        return ((Factory)proxyInstance).setCallbacks(callbacks);
                    };
                };
            }
        }
    };
}     
  
// 接口AopProxy.Object getProxy(@Nullable ClassLoader var1)
//  实现类JdkDynamicAopProxy且该类继承接口InvocationHandler.invoke(...)方法
//  实现类ObjenesisCglibAopProxy且该类继承CglibAopProxy

5.在执行方法时(Aspect拦截的方法),被CglibAopProxy$DynamicAdvisedInterceptor类的实例对象的intercept(...)方法拦截。

// CglibAopProxy$DynamicAdvisedInterceptor类的实例对象属性为
//     advised=ProxyFactory的实例对象
// proxy为代理对象,method 拦截的方法,args参数,methodProxy为CreateInfo.C1|C2
//     C1类字节码,C2为代理类字节码
// intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)

// advice
// ExposeInvocationInterceptor
// AspectJAfterThrowingAdvice
// AfterReturningAdviceInterceptor其属性advice=AspectJAfterReturningAdvice
// AspectJAfterAdvice
// AspectJAroundAdvice
// MethodBeforeAdviceInterceptor其属性advice=AspectJMethodBeforeAdvice

// 如果是@Transactional,则返回一个值chains=
//     TransactionInterceptor 其属性beanFactory,
//         其属性transactionAttributeSource对应的类AnnotationTransactionAttributeSource
List<Object> chains = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);

//new CglibMethodInvocation对象,并调用其父类ReflectiveMethodInvocation的
//    proceed()方法作用currentInterceptorIndex加1,直到执行调用完 
//                                 interceptorsAndDynamicMethodMatchers中的advice。
//                                                     
// 该对象属性 interceptorsAndDynamicMethodMatchers 存放chains中的advice
//           currentInterceptorIndex = -1  初始-1,处理完一个advice,该值加1。
new CglibAopProxy.CglibMethodInvocation(...).proceed()->{

    //调用chains数组中对象的invoke(mi); 
    //mi为CglibAopProxy.CglibMethodInvocation对象
    // 第一个advice:ExposeInvocationInterceptor 属性ThreadLocal<MethodInvocation> 
    //    invocation,目的将mi放到ThreadLocal中,通过ExposeInvocationInterceptor
    //  .invocation.get()
    ExposeInvocationInterceptor对象invoke(mi); 

    // ProceedingJoinPoint joinPoint为MethodInvocationProceedingJoinPoint对象
    //     其属性methodInvocation=为CglibAopProxy.CglibMethodInvocation对象
    //     其属性signature=为拦截的方法对象
    try {
        try {
            // 
            // 环绕方法执行joinPoint.proceed(); 实际就是将其属性
            // 的mi对象重新克隆出一个新的对象执行,currentInterceptorIndex加1
            AspectJAroundAdvice.invokeAdviceMethod(...)->{
                //这段代码时使用@Around下的方法的执行逻辑
                try {
                    1.执行joinPoint.proceed()前的逻辑 
                    2.joinPoint.proceed()->{
                    AspectJMethodBeforeAdvice.invokeAdviceMethod(...);
                    //拦截的方法体执行
                    this.invokeJoinpoint(); 
                    3.执行joinPoint.proceed()后的逻辑
                }catch(Exception e)
                    4.执行异常逻辑
                }finally{
                    5.执行最终逻辑
                }    
            }; 
        } finally {
            AspectJAfterAdvice.invokeAdviceMethod(...);
        }
        AspectJAfterReturningAdvice.afterReturning(...);
    }catch (Throwable var3) {     
       AspectJAfterThrowingAdvice.invokeAdviceMethod(...);
       throw var3;
    }
};

public class AspectJAfterThrowingAdvice {
    public Object invoke(MethodInvocation mi) throws Throwable {
        try {
            return mi.proceed();
        } catch (Throwable var3) {
            if (this.shouldInvokeOnThrowing(var3)) {
                this.invokeAdviceMethod(this.getJoinPointMatch(), (Object)null, var3);
            }

            throw var3;
        }
    }
}
public class AfterReturningAdviceInterceptor {
     public Object invoke(MethodInvocation mi) throws Throwable {
        Object retVal = mi.proceed();
        this.advice.afterReturning(retVal, mi.getMethod(), mi.getArguments(), mi.getThis());
        return retVal;
    }
}

public class AspectJAfterAdvice {
    public Object invoke(MethodInvocation mi) throws Throwable {
        Object var2;
        try {
            var2 = mi.proceed();
        } finally {
            this.invokeAdviceMethod(this.getJoinPointMatch(), (Object)null, (Throwable)null);
        }

        return var2;
    }
}

public class AspectJAroundAdvice {
    public Object invoke(MethodInvocation mi) throws Throwable {
        if (!(mi instanceof ProxyMethodInvocation)) {
            throw new IllegalStateException("MethodInvocation is not a Spring ProxyMethodInvocation: " + mi);
        } else {
            ProxyMethodInvocation pmi = (ProxyMethodInvocation)mi;
            ProceedingJoinPoint pjp = this.lazyGetProceedingJoinPoint(pmi);
            JoinPointMatch jpm = this.getJoinPointMatch(pmi);
            return this.invokeAdviceMethod(pjp, jpm, (Object)null, (Throwable)null);
        }
    }
}

public class MethodBeforeAdviceInterceptor {
    public Object invoke(MethodInvocation mi) throws Throwable {
        this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis());
        return mi.proceed();
    }
}

6.在执行方法时(@Transactional方法),被CglibAopProxy$DynamicAdvisedInterceptor类的实例对象的intercept(...)方法拦截。

//new CglibAopProxy.CglibMethodInvocation(...).proceed()
// 遍历执行interceptorsAndDynamicMethodMatchers
public class TransactionInterceptor {
    
    public Object invoke(MethodInvocation invocation)->{
            
            //其父类TransactionAspectSupport的方法
            this.invokeWithinTransaction()->{
                
                //DataSourceTransactionManager对象.doBegin() 
                //con.setAutoCommit(false);
                TransactionAspectSupport.TransactionInfo txInfo = 
                this.createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
                result = null;

                try {
                    //执行方法体
                    result = invocation.proceedWithInvocation();
                } catch (Throwable var17) {
                    //回滚
                    this.completeTransactionAfterThrowing(txInfo, var17);
                    throw var17;
                } finally {
                    //清除ThreadLocal<TransactionAspectSupport.TransactionInfo> 
                    //    transactionInfoHolder
                    this.cleanupTransactionInfo(txInfo);
                }
            
                //提交事务
                this.commitTransactionAfterReturning(txInfo);
                return result;
        }
    }
}
// 主要接口方法 Pointcut getPointcut()/getAdvice()
public class BeanFactoryTransactionAttributeSourceAdvisor {
    
    // 值为AnnotationTransactionAttributeSource对象
    private TransactionAttributeSource transactionAttributeSource;
    
    // 值为DefaultListableBeanFactory
    private BeanFactory beanFactory;
    
    // 值TransactionInterceptor对象t
    // 如果该对象t中的 PlatformTransactionManager transactionManager为null,则从对象t的 
    //    transactionManagerCache.get(DEFAULT_TRANSACTION_MANAGER_KEY)
    // 如果为null,则beanFactory中得到DataSourceTransactionManager对象,并放入
    // transactionManagerCache中key为DEFAULT_TRANSACTION_MANAGER_KEY
    
    // 用ProxyFactory对象的方法getInterceptorsAndDynamicInterceptionAdvice(
    //    method,targetClass)得到TransactionInterceptor对象
    // 使用TransactionInterceptor对象.invokeWithinTransaction(...)
    private transient volatile Advice advice;


}



//spring事务注解属性资源
public class AnnotationTransactionAttributeSource{
    //解析公共方法
    private final boolean publicMethodsOnly = true;
     
    //值为SpringTransactionAnnotationParser
    //SpringTransactionAnnotationParser.parseTransactionAnnotation(AnnotatedElement ae)
    //方法: 解析类方法上的@Transaction的属性赋值给RuleBasedTransactionAttribute对象
    private final Set<TransactionAnnotationParser> annotationParsers;
    
    //储存带有@Transaction注解方法
    // key MethodClassKey类 
    // value DefaultTransactionAttribute=PROPAGATION_REQUIRED,ISOLATION_DEFAULT
    //       RuleBasedTransactionAttribute
    private final Map<Object, TransactionAttribute> attributeCache;

}

public interface TransactionDefinition {
    int PROPAGATION_REQUIRED = 0;
    int PROPAGATION_SUPPORTS = 1;
    int PROPAGATION_MANDATORY = 2;
    int PROPAGATION_REQUIRES_NEW = 3;
    int PROPAGATION_NOT_SUPPORTED = 4;
    int PROPAGATION_NEVER = 5;
    int PROPAGATION_NESTED = 6;
    int ISOLATION_DEFAULT = -1;
    int ISOLATION_READ_UNCOMMITTED = 1;
    int ISOLATION_READ_COMMITTED = 2;
    int ISOLATION_REPEATABLE_READ = 4;
    int ISOLATION_SERIALIZABLE = 8;
    int TIMEOUT_DEFAULT = -1;
}

TransactionAspectSupport.TransactionInfo  其属性
transactionManager=DataSourceTransactionManager对象
transactionAttribute=PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
joinpointIdentification=org.sang.security01.OrderService.setOrder某方法
transactionStatus=DefaultTransactionStatus对象
this$0=TransactionInterceptor对象


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值