- 1. pom文件中添加相关依赖
- 2. 配置
2. 配置org.springframework.boot spring-boot-starter-aop
package com.example.tmshop.tm.common;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJexpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
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.*;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@Aspect
@Configuration
public class TransactionAdviceConfig {
private final static int METHOD_TIME_OUT = 5000;
//这里的第一个*代表的是任意返回值
//第二个代表任意类
//第三个代表任意方法
//..代表任意参数
private static final String POINTCUT_expression = "execution(* com.example.tmshop.tm.service.*.*(..))";
@Resource
private PlatformTransactionManager transactionManager;
@Bean
public TransactionInterceptor txAdvice() {
NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
RulebasedTransactionAttribute readonly = new RulebasedTransactionAttribute();
readOnly.setReadOnly(true);
//永远以非事务的方式执行,如果当前存在事务则将事务挂起
readOnly.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);
RulebasedTransactionAttribute required = new RulebasedTransactionAttribute();
//不论什么异常都会回滚
//因为setRollbackRules会给rollbackRules赋值,但是
//rollbackRules是一个集合,泛型是RollbackRuleAttribute
//RollbackRuleAttribute里面默认创建了一个public static final的异常,RunTimeException
//也就意味着所有的运行时异常都会被识别
required.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
required.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
required.setTimeout(METHOD_TIME_OUT);
Map attributesMap = new HashMap<>(30);
//设置增删改上传等使用事务
attributesMap.put("save*", required);
attributesMap.put("remove*", required);
attributesMap.put("update*", required);
attributesMap.put("batch*", required);
attributesMap.put("clear*", required);
attributesMap.put("add*", required);
attributesMap.put("append*", required);
attributesMap.put("modify*", required);
attributesMap.put("edit*", required);
attributesMap.put("insert*", required);
attributesMap.put("delete*", required);
attributesMap.put("do*", required);
attributesMap.put("create*", required);
attributesMap.put("import*", required);
//查询开启只读
attributesMap.put("select*", readOnly);
attributesMap.put("get*", readOnly);
attributesMap.put("valid*", readOnly);
attributesMap.put("list*", readOnly);
attributesMap.put("count*", readOnly);
attributesMap.put("find*", readOnly);
attributesMap.put("load*", readOnly);
attributesMap.put("search*", readOnly);
source.setNameMap(attributesMap);
return new TransactionInterceptor(transactionManager, source);
}
@Bean
public Advisor txAdviceAdvisor() {
AspectJexpressionPointcut pointcut = new AspectJexpressionPointcut();
pointcut.setexpression(POINTCUT_expression);
return new DefaultPointcutAdvisor(pointcut, txAdvice());
}
}
pointcut.setexpression(POINTCUT_expression);
return new DefaultPointcutAdvisor(pointcut, txAdvice());
}
}



