spring 相关

Spring注解--事务(二):源码分析

2019-01-10  本文已影响0人  aix91

1. @EnableTransactionManagement

通过EnableTransactionManagement,给容器中导入TransactionManagementConfigurationSelector

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement {
...
    AdviceMode mode() default AdviceMode.PROXY;
...
}

2. TransactionManagementConfigurationSelector

通过该类名可以知道,这个类会import其他的类到容器中

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

由于EnableTransactionManagement默认的AdviceMode是PROXY,因此该Selector会给容器中引入AutoProxyRegistrar和ProxyTransactionManagementConfiguration

3. AutoProxyRegistrar

它会给容器中注册一个InfrastructureAdvisorAutoProxyCreator,它是一个后置处理器,和AOP原理分析中的后置处理器一样(Spring注解--AOP原理(一):整体流程), 会返回一个目标对象的代理对象。

4. ProxyTransactionManagementConfiguration

@Configuration
public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration {
    @Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME)
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() {...}

    @Bean
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public TransactionAttributeSource transactionAttributeSource() {...}

    @Bean
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public TransactionInterceptor transactionInterceptor() {...}
}

我们可以看到,该类给容器中注入了事务增强器要用的注解信息:TransactionAttributeSource以及拦截器方法:TransactionInterceptor。于是当代理对象的方法调用时,会触发该拦截器方法(请参考Spring注解--AOP原理(五):代理对象目标方法的执行)。

5. TransactionInterceptor

protected Object invokeWithinTransaction(Method method, Class<?> targetClass, final InvocationCallback invocation)
            throws Throwable {
//获取事务的相关信息
final TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(method, targetClass);
//获取事务管理器
        final PlatformTransactionManager tm = determineTransactionManager(txAttr);
        final String joinpointIdentification = methodIdentification(method, targetClass);

        if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {
            // Standard transaction demarcation with getTransaction and commit/rollback calls.
            TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
            Object retVal = null;
            try {
                //指执行目标方法 
                retVal = invocation.proceedWithInvocation();
            }
            catch (Throwable ex) {
                // 如果异常,通过事务管理器回滚事务
                completeTransactionAfterThrowing(txInfo, ex);
                throw ex;
            }
            finally {
                cleanupTransactionInfo(txInfo);
            }
          //commit 事务
            commitTransactionAfterReturning(txInfo);
            return retVal;
        }
    ...
}

上一篇 下一篇

猜你喜欢

热点阅读