Spring 事务-06-事务拦截器-TransactionInterceptor

那年仲夏 提交于 2020-02-27 04:33:53

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());
	}

}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!