1.自定义接口
package com.hangzhou.executor.transaction;
import com.hangzhou.executor.transaction.enums.TransactionEnum;
import java.util.function.Supplier;
public interface TransactionExecutor {
/**
* 事务执行处理器
*
* @param transactionEnum 事务连接池配置枚举
* @param T Lamda表达式
* @param <RESULT> 执行的结果
* @return RESULT Lamda表达式执行的结果
*/
<RESULT> RESULT executor(TransactionEnum transactionEnum, Supplier<? extends RESULT> T);
}
2.自定义事务枚举
package com.hangzhou.executor.transaction.enums;
import org.apache.commons.lang3.StringUtils;
public enum TransactionEnum {
DRUID_DATA_SOURCE("druidDataSource", "druidDataSource连接的数据库");
private String code;
private String desc;
TransactionEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
private TransactionEnum getTransactionEnum(String code) {
if (StringUtils.isEmpty(code)) {
return null;
}
for (TransactionEnum transactionEnum : TransactionEnum.values()) {
if (code.equals(transactionEnum.getCode())) {
return transactionEnum;
}
}
return null;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
3.自定义事务模板实现类
package com.hangzhou.executor.transaction;
import com.hangzhou.executor.transaction.enums.TransactionEnum;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
public class TransactionExecutorImpl implements TransactionExecutor, BeanPostProcessor {
private ConcurrentHashMap<String, TransactionTemplate> concurrentHashMap = new ConcurrentHashMap<>();
@Override
public <RESULT> RESULT executor(TransactionEnum transactionEnum, Supplier<? extends RESULT> T) {
TransactionTemplate template = concurrentHashMap.get(transactionEnum.getCode());
if (template == null) {
throw new RuntimeException("TransactionTemplate is null");
}
return template.execute(new TransactionCallback<RESULT>() {
@Override
public RESULT doInTransaction(TransactionStatus status) {
try {
return T.get();
} catch (Exception e) {
status.setRollbackOnly();
throw new RuntimeException("transactionTemplate execute failed");
}
}
});
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof PlatformTransactionManager) {
TransactionTemplate template = new TransactionTemplate((PlatformTransactionManager) bean);
template.afterPropertiesSet();
concurrentHashMap.put(beanName, template);
}
return bean;
}
public void setConcurrentHashMap(ConcurrentHashMap<String, TransactionTemplate> concurrentHashMap) {
this.concurrentHashMap = concurrentHashMap;
}
}
4.spring xml文件配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="transactionExecutor" class="com.hangzhou.executor.transaction.TransactionExecutorImpl"/>
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="druidDataSource"/>
</bean>
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value=""/>
<property name="username" value=""/>
<property name="password" value=""/>
</bean>
</beans>
5.实现逻辑
package com.hangzhou.executor.transaction;
import com.hangzhou.executor.transaction.enums.TransactionEnum;
public class TransactionExecutorTest {
public static void main(String[] args) {
TransactionExecutor transactionExecutor = new TransactionExecutorImpl();
transactionExecutor.executor(TransactionEnum.DRUID_DATA_SOURCE, () -> {
return "此处写事务处理业务逻辑";
});
}
}