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;
}
...
}
网友评论