栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

事务与AOP的结合

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

事务与AOP的结合

与spring aop的结合有两种方式

  1. 使用@Aspect注解拦截匹配的类
  2. 实现Advisor接口并加入到ioc容器中

spring推荐用户使用AspectJ的方式,而其内部更多的是采用第二种方式,即实现Advisor,spring事务也是通过这种方式实现。

实现spring事务中有一个重要的类BeanFactoryTransactionAttributeSourceAdvisor,其就是打通编程式事务和AOP的桥梁,从而实现了申明式事务。

通过已有的基础认知,BeanFactoryTransactionAttributeSourceAdvisor中必然封装对应的Pointcut和Advice。

public abstract class AbstractBeanFactoryPointcutAdvisor extends AbstractPointcutAdvisor implements BeanFactoryAware {

	@Nullable
	private String adviceBeanName;
	@Nullable
	private BeanFactory beanFactory;
	@Nullable
	private transient volatile Advice advice;
	private transient volatile Object adviceMonitor = new Object();
}
public class BeanFactoryTransactionAttributeSourceAdvisor extends AbstractBeanFactoryPointcutAdvisor {

	@Nullable
	private TransactionAttributeSource transactionAttributeSource;
	private final TransactionAttributeSourcePointcut pointcut= new TransactionAttributeSourcePointcut() {
		@Override
		@Nullable
		protected TransactionAttributeSource getTransactionAttributeSource() {
			return transactionAttributeSource;
		}
	};
}

        不难猜测,这里的Advice实现一定是TransactionInterceptor,我们也可从事务包spring-tx中找到印证。

@Configuration(proxyBeanMethods = false)
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration {

    // Advice
    @Bean
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	public TransactionInterceptor transactionInterceptor(TransactionAttributeSource transactionAttributeSource) {
		TransactionInterceptor interceptor = new TransactionInterceptor();
		interceptor.setTransactionAttributeSource(transactionAttributeSource);
		if (this.txManager != null) {
			interceptor.setTransactionManager(this.txManager);
		}
		return interceptor;
	}
    
    // 事务Advisor
	@Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME)
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor(
			TransactionAttributeSource transactionAttributeSource, TransactionInterceptor transactionInterceptor) {

		BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor();
		advisor.setTransactionAttributeSource(transactionAttributeSource);
		advisor.setAdvice(transactionInterceptor);
		if (this.enableTx != null) {
			advisor.setOrder(this.enableTx.getNumber("order"));
		}
		return advisor;
	}

    // 事务属性
	@Bean
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	public TransactionAttributeSource transactionAttributeSource() {
		return new AnnotationTransactionAttributeSource();
	}
}

配置类将BeanFactoryTransactionAttributeSourceAdvisor注册成了bean,那么何时被织入代理对象呢?参见为对象查找匹配的Advisor。注册Advisor的同时也注册了TransactionAttributeSource的实现AnnotationTransactionAttributeSource,那么AnnotationTransactionAttributeSource就是解析事务注解@Transaction的工具类。

AnnotationTransactionAttributeSource
public abstract class AbstractFallbackTransactionAttributeSource
		implements TransactionAttributeSource, EmbeddedValueResolverAware {
	private static final TransactionAttribute NULL_TRANSACTION_ATTRIBUTE = new DefaultTransactionAttribute() {
 		// ...
	};
	@Nullable
	private transient StringValueResolver embeddedValueResolver;
 
	private final Map attributeCache = new ConcurrentHashMap<>(1024);
 
	@Override
	@Nullable
	public TransactionAttribute getTransactionAttribute(Method method, @Nullable Class targetClass) {
		if (method.getDeclaringClass() == Object.class) {
			return null;
		}

		// 先检查缓存
		Object cacheKey = getCacheKey(method, targetClass);
		TransactionAttribute cached = this.attributeCache.get(cacheKey);
		if (cached != null) {
			// Value will either be canonical value indicating there is no transaction attribute,
			// or an actual transaction attribute.
			if (cached == NULL_TRANSACTION_ATTRIBUTE) {
				return null;
			} else {
				return cached;
			}
		} else {
			// 根据方法评估具体的事务属性
			TransactionAttribute txAttr = computeTransactionAttribute(method, targetClass);
			// Put it in the cache.
			if (txAttr == null) {
				this.attributeCache.put(cacheKey, NULL_TRANSACTION_ATTRIBUTE);
			} else {
				String methodIdentification = ClassUtils.getQualifiedMethodName(method, targetClass);
				if (txAttr instanceof DefaultTransactionAttribute) {
					DefaultTransactionAttribute dta = (DefaultTransactionAttribute) txAttr;
					dta.setDescriptor(methodIdentification);
					dta.resolveAttributeStrings(this.embeddedValueResolver);
				}
				this.attributeCache.put(cacheKey, txAttr);
			}
			return txAttr;
		}
	}
 
	protected Object getCacheKey(Method method, @Nullable Class targetClass) {
		return new MethodClassKey(method, targetClass);
	}
 
	@Nullable
	protected TransactionAttribute computeTransactionAttribute(Method method, @Nullable Class targetClass) {
		// 不允许非public方法
		if (allowPublicMethodsonly() && !Modifier.isPublic(method.getModifiers())) {
			return null;
		}
		// 可能是桥接方法
		Method specificMethod = AopUtils.getMostSpecificMethod(method, targetClass);
		// 子类实现的查找方法
		TransactionAttribute txAttr = findTransactionAttribute(specificMethod);
		if (txAttr != null) {
			return txAttr;
		}
        // 先查找类上的属性定义信息
		txAttr = findTransactionAttribute(specificMethod.getDeclaringClass());
		if (txAttr != null && ClassUtils.isUserLevelMethod(method)) {
			return txAttr;
		}
		// 在查找方法上的
		if (specificMethod != method) {
			// Fallback is to look at the original method.
			txAttr = findTransactionAttribute(method);
			if (txAttr != null) {
				return txAttr;
			}
			// Last fallback is the class of the original method.
			txAttr = findTransactionAttribute(method.getDeclaringClass());
			if (txAttr != null && ClassUtils.isUserLevelMethod(method)) {
				return txAttr;
			}
		}

		return null;
	}
    // 又子类实现具体如何查找事务属性
	@Nullable
	protected abstract TransactionAttribute findTransactionAttribute(Class clazz);
	@Nullable
	protected abstract TransactionAttribute findTransactionAttribute(Method method);

}
public class AnnotationTransactionAttributeSource extends AbstractFallbackTransactionAttributeSource
		implements Serializable {
	// 对jdk规范的支持
	private static final boolean jta12Present;
	// 对ejb的支持
	private static final boolean ejb3Present;
	static {
		ClassLoader classLoader = AnnotationTransactionAttributeSource.class.getClassLoader();
		jta12Present = ClassUtils.isPresent("javax.transaction.Transactional", classLoader);
		ejb3Present = ClassUtils.isPresent("javax.ejb.TransactionAttribute", classLoader);
	}

	private final boolean publicMethodsOnly;
    // 注解解析器
	private final Set annotationParsers;
 
	public AnnotationTransactionAttributeSource(boolean publicMethodsOnly) {
		this.publicMethodsonly = publicMethodsOnly;
        // 初始化注解解析器
		if (jta12Present || ejb3Present) {
			this.annotationParsers = new linkedHashSet<>(4);
			this.annotationParsers.add(new SpringTransactionAnnotationParser());
			if (jta12Present) {
				this.annotationParsers.add(new JtaTransactionAnnotationParser());
			}
			if (ejb3Present) {
				this.annotationParsers.add(new Ejb3TransactionAnnotationParser());
			}
		} else {
			this.annotationParsers = Collections.singleton(new SpringTransactionAnnotationParser());
		}
	}
	// pointcut类匹配时会调用到的方法,检查是否是目标类
	@Override
	public boolean isCandidateClass(Class targetClass) {
		for (TransactionAnnotationParser parser : this.annotationParsers) {
        	// SpringTransactionAnnotationParser判断的是是否有@Transaction注解
			if (parser.isCandidateClass(targetClass)) {
				return true;
			}
		}
		return false;
	}
	@Override
	@Nullable
	protected TransactionAttribute findTransactionAttribute(Class clazz) {
		return determineTransactionAttribute(clazz);
	}
	@Override
	@Nullable
	protected TransactionAttribute findTransactionAttribute(Method method) {
		return determineTransactionAttribute(method);
	}
    // 注解解析器
	@Nullable
	protected TransactionAttribute determineTransactionAttribute(AnnotatedElement element) {
		for (TransactionAnnotationParser parser : this.annotationParsers) {
        	// 遍历事务解析器解析目标(类或方法)
			TransactionAttribute attr = parser.parseTransactionAnnotation(element);
			if (attr != null) {
				return attr;
			}
		}
		return null;
	}
}

事务注解解析器TransactionAnnotationParser

对于SpringTransactionAnnotationParser

public class SpringTransactionAnnotationParser implements TransactionAnnotationParser, Serializable {

	@Override
	public boolean isCandidateClass(Class targetClass) {
		return AnnotationUtils.isCandidateClass(targetClass, Transactional.class);
	}
	@Override
	@Nullable
	public TransactionAttribute parseTransactionAnnotation(AnnotatedElement element) {
        // 获取注解属性
		AnnotationAttributes attributes = AnnotatedElementUtils.findMergedAnnotationAttributes(
				element, Transactional.class, false, false);
		if (attributes != null) {
			return parseTransactionAnnotation(attributes);
		} else {
			return null;
		}
	}

	public TransactionAttribute parseTransactionAnnotation(Transactional ann) {
		return parseTransactionAnnotation(AnnotationUtils.getAnnotationAttributes(ann, false, false));
	}
	// 解析@Transaction注解属性
	protected TransactionAttribute parseTransactionAnnotation(AnnotationAttributes attributes) {
		RulebasedTransactionAttribute rbta = new RulebasedTransactionAttribute();

		Propagation propagation = attributes.getEnum("propagation");
		rbta.setPropagationBehavior(propagation.value());
		Isolation isolation = attributes.getEnum("isolation");
		rbta.setIsolationLevel(isolation.value());

		rbta.setTimeout(attributes.getNumber("timeout").intValue());
		String timeoutString = attributes.getString("timeoutString");
		Assert.isTrue(!StringUtils.hasText(timeoutString) || rbta.getTimeout() < 0,
				"Specify 'timeout' or 'timeoutString', not both");
		rbta.setTimeoutString(timeoutString);

		rbta.setReadonly(attributes.getBoolean("readOnly"));
		rbta.setQualifier(attributes.getString("value"));
		rbta.setLabels(Arrays.asList(attributes.getStringArray("label")));

		List rollbackRules = new ArrayList<>();
		for (Class rbRule : attributes.getClassArray("rollbackFor")) {
			rollbackRules.add(new RollbackRuleAttribute(rbRule));
		}
		for (String rbRule : attributes.getStringArray("rollbackForClassName")) {
			rollbackRules.add(new RollbackRuleAttribute(rbRule));
		}
		for (Class rbRule : attributes.getClassArray("noRollbackFor")) {
			rollbackRules.add(new NoRollbackRuleAttribute(rbRule));
		}
		for (String rbRule : attributes.getStringArray("noRollbackForClassName")) {
			rollbackRules.add(new NoRollbackRuleAttribute(rbRule));
		}
		rbta.setRollbackRules(rollbackRules);

		return rbta;
	}
 	// ... 
}
 java事务解析JtaTransactionAnnotationParser
public class JtaTransactionAnnotationParser implements TransactionAnnotationParser, Serializable {

	@Override
	public boolean isCandidateClass(Class targetClass) {
        // 判断的是javax.transaction.Transactional.class)
		return AnnotationUtils.isCandidateClass(targetClass, javax.transaction.Transactional.class);
	}
	@Override
	@Nullable
	public TransactionAttribute parseTransactionAnnotation(AnnotatedElement element) {
		AnnotationAttributes attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(
				element, javax.transaction.Transactional.class);
		if (attributes != null) {
			return parseTransactionAnnotation(attributes);
		} else {
			return null;
		}
	}

	public TransactionAttribute parseTransactionAnnotation(javax.transaction.Transactional ann) {
		return parseTransactionAnnotation(AnnotationUtils.getAnnotationAttributes(ann, false, false));
	}
	// 解析属性
	protected TransactionAttribute parseTransactionAnnotation(AnnotationAttributes attributes) {
		RulebasedTransactionAttribute rbta = new RulebasedTransactionAttribute();

		rbta.setPropagationBehaviorName(
				RulebasedTransactionAttribute.PREFIX_PROPAGATION + attributes.getEnum("value").toString());

		List rollbackRules = new ArrayList<>();
		for (Class rbRule : attributes.getClassArray("rollbackOn")) {
			rollbackRules.add(new RollbackRuleAttribute(rbRule));
		}
		for (Class rbRule : attributes.getClassArray("dontRollbackOn")) {
			rollbackRules.add(new NoRollbackRuleAttribute(rbRule));
		}
		rbta.setRollbackRules(rollbackRules);

		return rbta;
	}
	// ....
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/489866.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号