SpringBoot 使用配置类实现事务统一控制
@Transactional 注解进行事务控制
项目中利用业务层中定义的@Transactional 注解就可以实现事务的控制,但是这样的事务控制过于复杂。在大型的项目中可能存在成百上千的业务接口,全部使用注解控制必然会造成代码的大量重复。针对这个问题,可以通过定义一个事务配置类来解决。
定义事务控制类
直接上代码:
package com.lw.springbootjwt.config;
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.beans.factory.annotation.Autowired;
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.RuleBasedTransactionAttribute;
import org.springframework.transaction.interceptor.TransactionAttribute;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import java.util.HashMap;
import java.util.Map;
@Configuration
@Aspect //采用aop切面处理
public class TransactionConfig {
private static final int TRANSACTION_METHOD_TIMEOUT = 5; //事务超时时间为5秒
private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.lw.springbootjwt.service.*.*(..))"; //定义切面表达式
@Autowired
private PlatformTransactionManager transactionManager; //注入事务管理对象
@Bean("txAdvice") //Bean名称必须为txAdvice
public TransactionInterceptor transactionConfig(){ //定义事务控制切面
//定义只读事务控制,该事务不需要启动事务支持
RuleBasedTransactionAttribute readOnly = new RuleBasedTransactionAttribute();
readOnly.setReadOnly(true);
readOnly.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);
// 定义更新事务,同时设置事务操作的超时时间
RuleBasedTransactionAttribute requid = new RuleBasedTransactionAttribute();
requid.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
requid.setTimeout(TRANSACTION_METHOD_TIMEOUT);
Map<String, TransactionAttribute> transactionMap = new HashMap<>(); // 定义业务切面
transactionMap.put("add*",requid);
transactionMap.put("insert*",requid);
transactionMap.put("edit*",requid);
transactionMap.put("delete*",requid);
// 查询操作不需要事务控制
transactionMap.put("get*",readOnly);
transactionMap.put("list*",readOnly);
transactionMap.put("select*",readOnly);
NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
source.setNameMap(transactionMap);
TransactionInterceptor transactionInterceptor = new TransactionInterceptor(transactionManager,source);
return transactionInterceptor;
}
@Bean
public Advisor transactionAdvisor(){
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(AOP_POINTCUT_EXPRESSION); // 定义切面
return new DefaultPointcutAdvisor(pointcut,transactionConfig());
}
}
最后
以上代码可以直接复制使用,需要更改的地方是切面表达式这一块和需要进行事务控制的方法名称前缀,根据自身项目结构和方法名称进行修改即可。
一起努力,好好加油!!!