一、背景
springboot实现事务只需要在方法上添加@Transactional注解,但是需要在所有的service都加上事务,那就挺麻烦的。所以就需要采用AOP的方式实现全局事务处理。
考虑到作为不同项目来说,需要对多个不同的模块配置不同的超时时间的需求,所以采用注解的形式进行配置。
二、实现
1、创建注解类
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TxDefinitionRegistrar.class)
public @interface EnableTxManager {
/**
* 切点,默认是medbanks 下所有service
*/
String[] pointcut() default {
"* cn.xxx..service..*(..)"};
/**
* 超时时间
*/
int txMethodTimeOut() default 10;
}
2、创建一个注册器
public class TxDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
Map<String, Object> attributes = metadata.getAnnotationAttributes(EnableTxManager.class.getName());
assert attributes != null;
String pointcut = getPointcut(attributes);
int txMethodTimeOut = getTxMethodTimeOut(attributes);
BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(GlobalTransactionConfig.class);
definition.addPropertyValue("pointcut", pointcut);
definition.addPropertyValue("txMethodTimeOut", txMethodTimeOut