引入依赖
<!--事务管理需要这个做切面-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
编写事务管理的配置类
/**
* 事务的配置类
*/
@Configuration
public class TransactionConfig {
@Autowired
private DataSource dataSource;
/**
* 向容器中注入事务管理器
* 注意,要给该bean取一个名字,名字不要是transactionManager,否则会报错
*/
@Bean("txManager1")
public TransactionManager transactionManager(){
return new DataSourceTransactionManager(dataSource);
}
/**
* 向容器中注入TransactionInterceptor,
* TransactionInterceptor会完成事务切面的逻辑
* 注意,要给该bean取一个名字,名字不要是transactionInterceptor,否则会报错
*/
@Bean("txAdvice123")
public TransactionInterceptor transactionInterceptor(TransactionManager txManager1){
NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
//非只读事务
RuleBasedTransactionAttribute requiredTx = new RuleBasedTransactionAttribute();
requiredTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
//只读事务
RuleBasedTransactionAttribute readOnlyTx = new RuleBasedTransactionAttribute();
readOnlyTx.setReadOnly(true);
//配置加事务的规则,没有匹配到的方法将不会有事务,这些方法指的是Pointcut匹配到的方法
Map<String, TransactionAttribute> map = new HashMap<>();
map.put("add*", requiredTx);//Pointcut匹配到的方法中所有add开头的方法
map.put("save*", requiredTx);//Pointcut匹配到的方法中所有save开头的方法
map.put("insert*", requiredTx);
map.put("update*", requiredTx);
map.put("delete*", requiredTx);
map.put("select*", readOnlyTx);
map.put("get*", readOnlyTx);
source.setNameMap(map);
return new TransactionInterceptor(txManager1, source);
}
/**
* 向容器中注入切入点
*/
@Bean
public DefaultPointcutAdvisor defaultPointcutAdvisor(TransactionInterceptor txAdvice123){
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
advisor.setAdvice(txAdvice123);
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression("execution (* com.example.backup.service.*.*(..))");
advisor.setPointcut(pointcut);
return advisor;
}
}