1 用途
使用公共Spring事务基础结构({@link PlatformTransactionManager})实现声明性事务管理的AOP Alliance MethodInterceptor。
这个类派生自{@link TransactionAspectSupport}类,该类包含与Spring底层事务API的集成。
TransactionInterceptor只是按照正确的顺序调用相关的超类方法,比如{@link #invokeWithinTransaction}。
实现了 MethodInterceptor接口,重写invoke()方法,实现此方法以在调用之前和之后执行额外的处理。
2 类结构
3 代码分析
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.lang.Nullable;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.transaction.interceptor.TransactionAttributeSource;
import org.springframework.transaction.interceptor.TransactionProxyFactoryBean;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Properties;
/**
* 使用公共Spring事务基础结构({@link PlatformTransactionManager})实现声明性事务管理的AOP Alliance MethodInterceptor。
*
* 派生自{@link TransactionAspectSupport}类,该类包含与Spring底层事务API的集成。
* TransactionInterceptor只是按照正确的顺序调用相关的超类方法,比如{@link #invokeWithinTransaction}。
*
* TransactionInterceptors是线程安全的。
*
* @see TransactionProxyFactoryBean
* @see org.springframework.aop.framework.ProxyFactoryBean
* @see org.springframework.aop.framework.ProxyFactory
*/
@SuppressWarnings("serial")
public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor, Serializable {
/**
* 创建一个新的TransactionInterceptor。
* 仍然需要设置事务管理器和事务属性。
*
* @see #setTransactionManager
* @see #setTransactionAttributes(Properties)
* @see #setTransactionAttributeSource(TransactionAttributeSource)
*/
public TransactionInterceptor() {
}
/**
* 创建一个新的TransactionInterceptor。
*
* @param ptm 执行实际事务管理的默认事务管理器
* @param attributes 属性格式的事务属性
* @see #setTransactionManager
* @see #setTransactionAttributes(Properties)
*/
public TransactionInterceptor(PlatformTransactionManager ptm, Properties attributes) {
setTransactionManager(ptm);
setTransactionAttributes(attributes);
}
/**
* 创建一个新的TransactionInterceptor。
*
* @param ptm 执行实际事务管理的默认事务管理器
* @param tas 用于查找事务属性的属性源
* @see #setTransactionManager
* @see #setTransactionAttributeSource(TransactionAttributeSource)
*/
public TransactionInterceptor(PlatformTransactionManager ptm, TransactionAttributeSource tas) {
setTransactionManager(ptm);
setTransactionAttributeSource(tas);
}
/**
* 方法的入口,非常重要。
* MethodInterceptor接口中的方法实现。
*
* 实现此方法以在调用之前和之后执行额外的处理。
* 礼貌的实现当然希望调用{@link Joinpoint#proceed()}。
*
* @param invocation
* @return
* @throws Throwable
*/
@Override
@Nullable
public Object invoke(MethodInvocation invocation) throws Throwable {
// 计算出目标类:可能是{@code null}。
// TransactionAttributeSource应该传递目标类和方法,它们可能来自接口。
Class<?> targetClass = (invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null);
// 调用 TransactionAspectSupport 的 invokeWithinTransaction…
return invokeWithinTransaction(invocation.getMethod(), targetClass, invocation::proceed);
}
//---------------------------------------------------------------------
// 序列化支持
//---------------------------------------------------------------------
private void writeObject(ObjectOutputStream oos) throws IOException {
// 依赖于默认的序列化,尽管这个类本身并不携带状态…
oos.defaultWriteObject();
// 超类字段进行反序列化。
oos.writeObject(getTransactionManagerBeanName());
oos.writeObject(getTransactionManager());
oos.writeObject(getTransactionAttributeSource());
oos.writeObject(getBeanFactory());
}
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
// 依赖于默认的序列化,尽管这个类本身并不携带状态…
ois.defaultReadObject();
// 序列化所有相关的超类字段。
// 超类不能实现Serializable,因为它还充当了AspectJ方面的基类(不允许实现Serializable)!
setTransactionManagerBeanName((String) ois.readObject());
setTransactionManager((PlatformTransactionManager) ois.readObject());
setTransactionAttributeSource((TransactionAttributeSource) ois.readObject());
setBeanFactory((BeanFactory) ois.readObject());
}
}
来源:oschina
链接:https://my.oschina.net/u/3777515/blog/3164575