
com.github.anonymousmister.bootfastconfig.config.TransactionAdviceConfig Maven / Gradle / Ivy
package com.github.anonymousmister.bootfastconfig.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.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;
import org.springframework.transaction.interceptor.DefaultTransactionAttribute;
import org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.stream.Stream;
/**
* @author admin
* @title: TransactionAdviceConfig
* @projectName demo
* @description: 配置事务管理
* @date 2019/6/2113:35
*/
@Configuration
@ConditionalOnClass(value = {Aspect.class, AspectJExpressionPointcut.class, DataSourceTransactionManager.class})
@Order()
@Aspect
@ConditionalOnProperty(prefix = "fastconfig", name = "transactionAdvice", havingValue = "true")
public class TransactionAdviceConfig implements TransactionManagementConfigurer {
private static final String AOP_POINTCUT_EXPRESSION = "execution (* com.***.service.*.*(..))";
private static final String[] write = {"add*", "save*", "delete*", "update*", "exec*", "set*", "import*", "del*"};
private static final String[] read = {"get*", "query*", "find*", "list*", "count*", "is*", "export*"};
@Resource(name = "txManager")
private PlatformTransactionManager txManager2;
@Bean("txManager")
public PlatformTransactionManager annotationDrivenTransactionManager(@Qualifier("dataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean("txAdvice")
public TransactionInterceptor txAdvice(@Qualifier("txManager") PlatformTransactionManager transactionManager) {
/**
* 设置 事务配置 写操作
* 事务传播为 :
* 当前是否有事务,无创建新的
*
*/
DefaultTransactionAttribute txAttr_REQUIRED = new DefaultTransactionAttribute();
txAttr_REQUIRED.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
/**
* 设置 事务配置 读操作
* 事务传播为 :
* 当前是否有事务,无创建新的
* 事务只读 :
* 为防止脏读,幻读
*
*/
DefaultTransactionAttribute txAttr_REQUIRED_READONLY = new DefaultTransactionAttribute();
txAttr_REQUIRED_READONLY.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
txAttr_REQUIRED_READONLY.setReadOnly(true);
NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
Stream.of(write).forEach((o) -> {
source.addTransactionalMethod(o, txAttr_REQUIRED);
});
Stream.of(read).forEach((o) -> {
source.addTransactionalMethod(o, txAttr_REQUIRED_READONLY);
});
return new TransactionInterceptor(transactionManager, source);
}
@Bean
public Advisor txAdviceAdvisor(@Qualifier("txAdvice") TransactionInterceptor txAdvice) {
/**
* 配置事务的aop点
* 只在service 有事务
*
*/
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
return new DefaultPointcutAdvisor(pointcut, txAdvice);
}
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return txManager2;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy