引入依賴
<!--事務管理需要這個做切面-->
<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;
}
}