Spring事务05事务基类TransactionAspectSupport
事务方面的基类,如{@link TransactionInterceptor}或AspectJ方面。
这使得底层的Spring事务基础结构可以很容易地用于为任何方面系统实现方面。
子类负责以正确的顺序调用该类中的方法。
注意:这个类不能实现Serializable,因为它是AspectJ方面的基类(不允许实现Serializable)!
2 类图
3 类核心方法
import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.BeanFactoryAnnotationUtils;
import org.springframework.core.NamedThreadLocal;
import org.springframework.lang.Nullable;
import org.springframework.transaction.NoTransactionException;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.TransactionSystemException;
import org.springframework.transaction.interceptor.*;
import org.springframework.transaction.support.CallbackPreferringPlatformTransactionManager;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.ConcurrentReferenceHashMap;
import org.springframework.util.StringUtils;
import java.lang.reflect.Method;
import java.util.Properties;
import java.util.concurrent.ConcurrentMap;
/**
* 事务方面的基类,如{@link TransactionInterceptor}或AspectJ方面。
* 这使得底层的Spring事务基础结构可以很容易地用于为任何方面系统实现方面。
*
* 注意:这个类不能实现Serializable,因为它是AspectJ方面的基类(不允许实现Serializable)!
*
* <p> 子类负责以正确的顺序调用该类中的方法。
*
* <p>
* 如果{@code TransactionAttribute}中没有指定事务名,
* 则公开的名称将是{@code 完全限定类名 + "." + 方法名}(默认)。
*
* <p>
* 使用策略设计模式。
* {@code PlatformTransactionManager}实现将执行实际的事务管理,{@code TransactionAttributeSource}用于确定事务定义。
*
* <p>
* 如果事务方面的{@code PlatformTransactionManager}和{@code TransactionAttributeSource}是可序列化的,
* 则事务方面是可序列化的。
*
* @since 1.1
* @see #setTransactionManager
* @see #setTransactionAttributes
* @see #setTransactionAttributeSource
*/
public abstract class TransactionAspectSupport implements BeanFactoryAware, InitializingBean {
@Nullable
private String transactionManagerBeanName;
@Nullable
private PlatformTransactionManager transactionManager;
@Nullable
private TransactionAttributeSource transactionAttributeSource;
/**
* 用于基于around-advice的子类的常规委托,委托给该类上的其他几个模板方法。
* 能够处理{@link CallbackPreferringPlatformTransactionManager}以及常规{@link PlatformTransactionManager}实现。
*
* @param method 被调用的方法
* @param targetClass 我们调用方法的目标类
* @param invocation 用于继续目标调用的回调
* @return 方法的返回值(如果有)
* @throws Throwable propagated from the target invocation
*/
@Nullable
protected Object invokeWithinTransaction(Method method, @Nullable Class<?> targetClass,
final InvocationCallback invocation) throws Throwable {
// 如果事务属性为空,则该方法是非事务性的。
TransactionAttributeSource tas = getTransactionAttributeSource();
final TransactionAttribute txAttr = (tas != null ? tas.getTransactionAttribute(method, targetClass) : null);
final PlatformTransactionManager tm = determineTransactionManager(txAttr);
final String joinpointIdentification = methodIdentification(method, targetClass, txAttr);
if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {
// 使用getTransaction和提交/回滚调用的标准事务划分。
TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
Object retVal = null;
try {
// 这是一个around建议:调用链中的下一个拦截器。
// 这通常会导致调用目标对象。
retVal = invocation.proceedWithInvocation();
}
catch (Throwable ex) {
// 目标调用异常
completeTransactionAfterThrowing(txInfo, ex);
throw ex;
}
finally {
// 清理资源
cleanupTransactionInfo(txInfo);
}
// 目标调用正确,提交事务
commitTransactionAfterReturning(txInfo);
return retVal;
}
else {
final ThrowableHolder throwableHolder = new ThrowableHolder();
// 它是一个CallbackPreferringPlatformTransactionManager:传入一个TransactionCallback。
try {
Object result = ((CallbackPreferringPlatformTransactionManager) tm).execute(txAttr, 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);
}
});
// 检查结果状态:它可能指示一个可抛出的重新抛出。
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;
}
}
}
}
以上是 Spring事务05事务基类TransactionAspectSupport 的全部内容, 来源链接: utcz.com/z/513304.html