目录
1.事务注解BeanDefinition解析器AnnotationDrivenBeanDefinitionParser
1.1 InfrastructureAdvisorAutoProxyCreator
1.2 AnnotationTransactionAttributeSource
1.4 BeanFactoryTransactionAttributeSourceAdvisor
0. 声明式事务的开启
spring配置文件中<tx:annotation-driven/>开启事务注解驱动,并通过TxNamespaceHandler对该tag进行处理,TxNamespaceHandler类初始化方法引入了AnnotationDrivenBeanDefinitionParser,如下:
public class TxNamespaceHandler extends NamespaceHandlerSupport {
static final String TRANSACTION_MANAGER_ATTRIBUTE = "transaction-manager";
static final String DEFAULT_TRANSACTION_MANAGER_BEAN_NAME = "transactionManager";
static String getTransactionManagerName(Element element) {
return (element.hasAttribute(TRANSACTION_MANAGER_ATTRIBUTE) ?
element.getAttribute(TRANSACTION_MANAGER_ATTRIBUTE) : DEFAULT_TRANSACTION_MANAGER_BEAN_NAME);
}
@Override
public void init() {
registerBeanDefinitionParser("advice", new TxAdviceBeanDefinitionParser());
registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
registerBeanDefinitionParser("jta-transaction-manager", new JtaTransactionManagerBeanDefinitionParser());
}
}
1.事务注解BeanDefinition解析器AnnotationDrivenBeanDefinitionParser
该解析器通过解析<tx/>标签,主要引入了如下的beandefinition:
- InfrastructureAdvisorAutoProxyCreator 切面自动代理创建类
- AnnotationTransactionAttributeSource 事务注解属性源
- TransactionInterceptor 事务拦截器
- BeanFactoryTransactionAttributeSourceAdvisor 事务属性源切面
1.1 InfrastructureAdvisorAutoProxyCreator
首先看一下继承结构,如下,可以看出该继承结构和上篇文章Spring源码:Aop源码分析 Aop代理创建的继承结构是一样的,因此InfrastructureAdvisorAutoProxyCreator主要完成动态代理的创建,具体分析参考上篇;
1.2 AnnotationTransactionAttributeSource
该事务属性源对象实现TransactionAttributeSource的接口方法TransactionAttribute getTransactionAttribute(Method method, Class<?> targetClass),计算目标类和目标方法的事务属性配置信息,包括传播行为、隔离级别、超时时间以及异常回滚等;
1.3 TransactionInterceptor
事务拦截器,主要完成目标方法的拦截,进行事务的植入,具体拦截逻辑在TransactionAspectSupport抽象类中,同时它是线程安全的,主要是借助
private static final ThreadLocal<TransactionInfo> transactionInfoHolder = new NamedThreadLocal<TransactionInfo>("Current aspect-driven transaction")来保证的;同时通过属性注入的方式注入了AnnotationTransactionAttributeSource,完成事务配置信息的获取;
/**
* General delegate for around-advice-based subclasses, delegating to several other template
* methods on this class. Able to handle {@link CallbackPreferringPlatformTransactionManager}
* as well as regular {@link PlatformTransactionManager} implementations.
* @param method the Method being invoked
* @param targetClass the target class that we're invoking the method on
* @param invocation the callback to use for proceeding with the target invocation
* @return the return value of the method, if any
* @throws Throwable propagated from the target invocation
*/
protected Object invokeWithinTransaction(Method method, Class<?> targetClass, final InvocationCallback invocation)
throws Throwable {
// If the transaction attribute is null, the method is non-transactional.
final TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(method, targetClass);
final PlatformTransactionManager tm = determineTransactionManager(txAttr);
final String joinpointIdentification = methodIdentification(method, targetClass, txAttr);
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 {
// This is an around advice: Invoke the next interceptor in the chain.
// This will normally result in a target object being invoked.
retVal = invocation.proceedWithInvocation();
}
catch (Throwable ex) {
// target invocation exception
completeTransactionAfterThrowing(txInfo, ex);
throw ex;
}
finally {
cleanupTransactionInfo(txInfo);
}
commitTransactionAfterReturning(txInfo);
return retVal;
}
else {
final ThrowableHolder throwableHolder = new ThrowableHolder();
// It's a CallbackPreferringPlatformTransactionManager: pass a TransactionCallback in.
try {
Object result = ((CallbackPreferringPlatformTransactionManager) tm).execute(txAttr,
new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus status) {
TransactionInfo txInfo = prepareTransactionInfo(tm, txAttr, joinpointIdentification, status);
try {
return invocation.proceedWithInvocation();
}
catch (Throwable ex) {
if (txAttr.rollbackOn(ex)) {
// A RuntimeException: will lead to a rollback.
if (ex instanceof RuntimeException) {
throw (RuntimeException) ex;
}
else {
throw new ThrowableHolderException(ex);
}
}
else {
// A normal return value: will lead to a commit.
throwableHolder.throwable = ex;
return null;
}
}
finally {
cleanupTransactionInfo(txInfo);
}
}
});
// Check result state: It might indicate a Throwable to rethrow.
if (throwableHolder.throwable != null) {
throw throwableHolder.throwable;
}
return result;
}
catch (ThrowableHolderException ex) {
throw ex.getCause();
}
catch (TransactionSystemException ex2) {
if (throwableHolder.throwable != null) {
logger.error("Application exception overridden by commit exception", throwableHolder.throwable);
ex2.initApplicationException(throwableHolder.throwable);
}
throw ex2;
}
catch (Throwable ex2) {
if (throwableHolder.throwable != null) {
logger.error("Application exception overridden by commit exception", throwableHolder.throwable);
}
throw ex2;
}
}
}
1.4 BeanFactoryTransactionAttributeSourceAdvisor
BeanFactoryTransactionAttributeSourceAdvisor是一个事务切面,通过属性注入的方式包装了如上的AnnotationTransactionAttributeSource以及TransactionInterceptor,前者主要用于切点的定义,后者用来表示增强Advice;这样,通过InfrastructureAdvisorAutoProxyCreator类就可以过滤出符合指定class的拦截器链