基于AOP实现整体项目事务控制

简介: 基于AOP实现整体项目事务控制

@[toc]

事务在项目中的用法

在项目中,我们事务一般使用注解的方式控制,当我们的实现类多的时候,业务都需要事务控制的时候,每个方法加 注解,会发现代码十分十分冗余

在这里插入图片描述

我们可以利用Spring 生态下的 AOP实现事务的统一控制

下面我们就介绍下基于AOP事务统一控制(以springboot项目为例)

  1. 引入 需要的pom 文件
<!-- aop依赖 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>${aspectj.version}</version>
        </dependency>


        <aspectj.version>1.8.9</aspectj.version>
  1. 创建 TransactionManagerConfig 类
// 使用Aspect 注解与  Configuration
@Aspect
@Configuration
public class TransactionManagerConfig  {
    private final static Logger logger = LoggerFactory.getLogger(TransactionManagerConfig.class);
    private static final int AOP_TIME_OUT = 50000;
    private static final String AOP_POINTCUT_EXPRESSION = "execution(* com.yxl.demo.impl.*Impl.*(..)))";

    @Autowired
    private PlatformTransactionManager transactionManager;

    @Bean
    public TransactionInterceptor txAdvice(){
        //new NameMatchTransactionAttributeSource 事务属性
        NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();

        /** 只读事务,不做更新操作 */
        RuleBasedTransactionAttribute readOnlyTx = new RuleBasedTransactionAttribute();
        readOnlyTx.setReadOnly(true);
        readOnlyTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

        /** 当前存在事务就使用当前事务,当前不存在事务就创建一个新的事务 */
        RuleBasedTransactionAttribute requiredTx = new RuleBasedTransactionAttribute();

        /** 什么异常需要回滚 */
        requiredTx.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
        requiredTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        requiredTx.setTimeout(AOP_TIME_OUT);

        Map<String, TransactionAttribute> methodMap = new HashMap<>();
        // 回滚事务的方法,增删改
        methodMap.put("add*", requiredTx);
        methodMap.put("save*", requiredTx);
        methodMap.put("update*", requiredTx);
        methodMap.put("modify*", requiredTx);
        methodMap.put("edit*", requiredTx);
        methodMap.put("insert*", requiredTx);
        methodMap.put("delete*", requiredTx);
        methodMap.put("remove*", requiredTx);

        /** 其他方法无事务,只读 */
        methodMap.put("*", readOnlyTx);
        source.setNameMap(methodMap);

        TransactionInterceptor txAdvice = new TransactionInterceptor(transactionManager, source);
        return txAdvice;
    }

    @Bean(name = "txAdviceAdvisor")
    public Advisor txAdviceAdvisor() {
        logger.info("===============================创建txAdviceAdvisor===================================");
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
        return new DefaultPointcutAdvisor(pointcut, txAdvice());

    }

}

他会扫描 com.yxl.demo.impl.Impl.(..) 包下的所有方法的前缀

这时候我们可以 用 delete方法写个空指针测试下

相关文章
|
XML Java 数据格式
13Spring - Spring转账Demo(了解事务及AOP)
13Spring - Spring转账Demo(了解事务及AOP)
41 0
|
22天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
34 1
|
6月前
|
XML Java 数据格式
Spring 项目如何使用AOP
Spring 项目如何使用AOP
64 2
|
6月前
|
Java 数据库连接 数据库
AOP&事务
AOP&事务
50 0
|
6月前
|
XML Java 数据库连接
【Spring】JDBC、AOP、事务
【Spring】JDBC、AOP、事务
|
6月前
|
Java Spring
使用spring的aop实现全局的事务控制
使用spring的aop实现全局的事务控制
139 0
|
存储 SpringCloudAlibaba Java
Spring基于AOP事务控制实现原理
对于一个系统应用而言,使用数据库进行数据存储是必然的,意味着开发过程中事务的使用及控制也是必不可少的,当然事务是数据库层面的知识点并不是`Spring`框架所提出的。使用JDBC开发时,我们使用`connnection`对事务进行控制,使用`MyBatis`时,我们使用`SqlSession`对事务进行控制,缺点显而易见,当我们切换数据库访问技术时,事务控制的方式总会变化,所以`Spring` 就在这些技术基础上,提供了统一的控制事务的接口。Spring的事务分为:编程式事务控制和声明式事务控制
31348 10
Spring基于AOP事务控制实现原理
|
11月前
|
XML Java 编译器
Spring的AOP和事务
Spring的AOP和事务
45 0
|
监控 Cloud Native Java
Spring AOP:面向切面编程在实际项目中的应用
Spring AOP:面向切面编程在实际项目中的应用
131 0
|
Java 测试技术 开发者
深入解析Spring的IOC与AOP及其在项目中的应用
深入解析Spring的IOC与AOP及其在项目中的应用
541 1