基于springboot自定义事务注解「建议收藏」

基于springboot自定义事务注解1.开启注解支持(springboot默认支持注解)2.自定义注解接口3.写事务类4.写切面类2.自定义注解接口importjava.lang.annotation.*;/***注解类*/@Target(ElementType.METHOD)//定义注解用在方法上@Retention(RetentionPolicy.RUNTIME)//运行时注解@Documentedpublic@int

大家好,又见面了,我是你们的朋友全栈君。

基于springboot自定义事务注解

1.开启注解支持(springboot默认支持注解)
2.自定义注解接口
3.写事务类
4.写切面类

2.自定义注解接口

import java.lang.annotation.*;


/** * 注解类 */
@Target(ElementType.METHOD)             //定义注解用在方法上
@Retention(RetentionPolicy.RUNTIME)     //运行时注解
@Documented
public @interface CustomTransaction { 
   
    String value() default "";
}

3.写事务类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.interceptor.DefaultTransactionAttribute;

@Component
@Scope(value = "prototype")
public class TransactionUtils { 
   


    @Autowired
    private DataSourceTransactionManager dataSourceTransactionManager;

    /** *初始化创建TransactionStatus对象 * @return */
    public TransactionStatus init(){ 
   
        System.out.println("创建事务了...");
        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());
        return transactionStatus;
    }

    /** * 提交事务 * @param transactionStatus */
    public void commit(TransactionStatus transactionStatus){ 
   
        System.out.println("提交事务...");
        dataSourceTransactionManager.commit(transactionStatus);
    }


    public void rollback(TransactionStatus transactionStatus){ 
   
        System.out.println("事务回滚了....");
        dataSourceTransactionManager.rollback(transactionStatus);
    }
}

4.写切面类

import io.tianma.common.annotation.CustomTransaction;
import io.tianma.common.utils.TransactionUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionStatus;

import java.lang.reflect.Method;

@Aspect
@Component
public class CustomTransactionAspect { 
   

    @Autowired
    TransactionUtils transactionUtils;

    /** * 选择切面的注解CustomTransaction */
    @Pointcut("@annotation(io.tianma.common.annotation.CustomTransaction)")
    public void transactionPointCut() { 
   

    }

    /** * 方法增强@Arounbd * @param point */
    @Around("transactionPointCut()")
    public void around(ProceedingJoinPoint point){ 
   
        MethodSignature signature = (MethodSignature) point.getSignature();
        Method method = signature.getMethod();//获取到方法对象

        //获取到注解类
        CustomTransaction annotation = method.getAnnotation(CustomTransaction.class);
        if(annotation != null){ 
   
            System.out.println(annotation.value());//打印注解上value的内容
        }

        //请求的类名以及方法名
        String className = point.getTarget().getClass().getName();
        String methodName = signature.getName();
        System.out.println("执行的方法为:" + className + "." + methodName + "()");

        //开启事务
        TransactionStatus transactionStatus = transactionUtils.init();

        try { 
   
            //执行方法
            point.proceed();

            //执行成功提交事务
            transactionUtils.commit(transactionStatus);
        } catch (Throwable throwable) { 
   
            //执行方法出错则回滚事务
            transactionUtils.rollback(transactionStatus);
        }
    }
}

5.项目service

    @Override
   @CustomTransaction("新增用户开启事务")
   public void saveUser() { 
   
      SysUserEntity user = new SysUserEntity();
      user.setUserId("D123456");
      user.setName("张三");
      user.setCreateUserId("D123456");
      user.setCreateTime(new Date());
      this.save(user);

// System.out.println(1/0);

      SysUserRoleEntity sysUserRoleEntity = new SysUserRoleEntity();
      sysUserRoleEntity.setRoleId(123456L);
      sysUserRoleEntity.setUserId("123456");

      sysUserRoleService.save(sysUserRoleEntity);
   }

6.先查询数据库

在这里插入图片描述
在这里插入图片描述
查询数据库没有数据

7. 调用api

在这里插入图片描述

可以看出控制台已经执行成功
再查询一次数据库
在这里插入图片描述
在这里插入图片描述
可以看到已经有一条记录产生,并且切面也已经执行了

8.打开注释(System.out.println(1/0)),并且将user_id改为D1234567

SysUserEntity user = new SysUserEntity();
user.setUserId("D1234567");
user.setName("张三");
user.setCreateUserId("D1234567");
user.setCreateTime(new Date());
this.save(user);

System.out.println(1/0);

SysUserRoleEntity sysUserRoleEntity = new SysUserRoleEntity();
sysUserRoleEntity.setRoleId(1234567L);
sysUserRoleEntity.setUserId("1234567");

sysUserRoleService.save(sysUserRoleEntity);

在这里插入图片描述
可以看出事务进行回滚了,再查询一次数据库
在这里插入图片描述
在这里插入图片描述

可以看到报错后事务并没有进行提交,而是进行了回滚

结尾

自此基于springboot的自定义事务注解已完成

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129167.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux分区及格式_ubuntu安装系统分区

    linux分区及格式_ubuntu安装系统分区操作环境:vmware虚机一、整体流程在使用fdisk/parted等分区工具对硬盘分区之后,是否使用LVM由用户决定: 1)可以直接对分区后的硬盘进行格式化操作,之后挂载分区; 2)也可以先用LVM逻辑卷管理工具对分区后的物理卷进行管理,之后再对逻辑卷进行格式化操作,之后挂载分区。(LVM的分区类型为8e) 使用LVM的好处是方

    2022年11月3日
  • pycharm配置flask环境_pycharm集成Django

    pycharm配置flask环境_pycharm集成Django参考:使用Pycharm+Flask开启DEBUG模式的坑pycharm创建flask应用Flask在Pycharm开启调试模式

    2022年10月29日
  • windows实现mysql读写分离[通俗易懂]

    一、主服务器(master)配置1、修改MySQL配置文件my.ini[mysqld]log-bin=mysql-bin#开启主从复制,主库的配置log-bin-index=mysql-bin.indexserver-id=1#指定主库serverid,主库的id要比从库的id小sync_binlog=1binlog_format=mixed

    2022年4月17日
  • ostaskcreate函数_freertos

    ostaskcreate函数_freertosOSTaskCreate()函数原型:INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio)调用者:任务或者是初始化代码。作用:建立一个新任务,任务的建立可以在多个任务环境启动之前,也可以在正在运行的任务中建立,中断处理程序中不能建立任务,一个任务必须为无限循环结构,且不能有返…

    2022年9月3日
  • 全国大学生电子设计竞赛(七)–逆变电源设计

    全国大学生电子设计竞赛(七)–逆变电源设计  逆变电源在全国大学生电子设计竞赛电源类题目中占十分重要的地位。每一个参加全国大学生电子设计竞赛并选择电源方向的学生都需要掌握逆变电源的设计制作。与整流相反,把直流电变为交流电称为逆变。逆变电路的应用非常广泛。当需要蓄电池、干电池、太阳能电池等直流电源向交流负载供电时,就需要逆变电路。除此之外,应用非常广泛的交流电机调速用变频器、不间断电源UPS、感应加热电源等电力电子装置的核心电路就是逆变电…

    2022年6月12日
  • python保存两位小数的几种方法,python2保留小数

    python保存两位小数的几种方法,python2保留小数python保存两位小数的几种方法文章目录:一、保留两位小数且做四舍五入处理1、使用字符串格式化2、使用python内置的round()函数3、使用python内置的decimal模块二、保留两位小数且不做四舍五入处理1、使用序列中的切片2、使用re正则匹配模块一、保留两位小数且做四舍五入处理1、使用字符串格式化>>>x=3.1415926>&…

    2022年8月11日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号