Spring事务06事务拦截器TransactionInterceptor

编程

使用公共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());

}

}

 

以上是 Spring事务06事务拦截器TransactionInterceptor 的全部内容, 来源链接: utcz.com/z/513303.html

回到顶部