1. 程式人生 > >SpringDataJpa自定義事務攔截器

SpringDataJpa自定義事務攔截器

作用為 不用寫Transactional,用AOP來實現自動分配事務

如下

package com.fewstrong.common;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor;
import org.springframework.context.annotation.Bean;
import org.springframework.
context.annotation.Configuration; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource; import org.springframework.transaction.interceptor.
RollbackRuleAttribute; import org.springframework.transaction.interceptor.RuleBasedTransactionAttribute; import org.springframework.transaction.interceptor.TransactionAttribute; import org.springframework.transaction.interceptor.TransactionAttributeSource; import org.springframework.transaction.interceptor.
TransactionInterceptor; /** * @author YangLiqiang */ @Configuration public class TxAnoConfig { /* 事務攔截型別 */ @Bean("txSource") public TransactionAttributeSource transactionAttributeSource() { NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource(); RuleBasedTransactionAttribute readOnlyTx = new RuleBasedTransactionAttribute(); readOnlyTx.setReadOnly(true); readOnlyTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED); RuleBasedTransactionAttribute requiredTx = new RuleBasedTransactionAttribute( TransactionDefinition.ISOLATION_DEFAULT, Collections.singletonList(new RollbackRuleAttribute(Exception.class))); requiredTx.setTimeout(5); Map<String, TransactionAttribute> txMap = new HashMap<>(); txMap.put("add*", requiredTx); txMap.put("save*", requiredTx); txMap.put("insert*", requiredTx); txMap.put("update*", requiredTx); txMap.put("delete*", requiredTx); txMap.put("get*", readOnlyTx); txMap.put("find*", readOnlyTx); source.setNameMap(txMap); return source; } /** 切面攔截規則 引數會自動從容器中注入 */ @Bean public AspectJExpressionPointcutAdvisor pointcutAdvisor(TransactionInterceptor txInterceptor) { AspectJExpressionPointcutAdvisor pointcutAdvisor = new AspectJExpressionPointcutAdvisor(); pointcutAdvisor.setAdvice(txInterceptor); pointcutAdvisor.setExpression("execution (* com.fewstrong..*.*(..))"); return pointcutAdvisor; } /* 事務攔截器 */ @Bean("txInterceptor") TransactionInterceptor getTransactionInterceptor(PlatformTransactionManager tx) { return new TransactionInterceptor(tx, transactionAttributeSource()); } }