Spring如何进行事务管理?什么是面向切面编程?

d874b92250061004831ce4f7b89820cd.gif

喜欢就点击上方关注我们吧!

4cded0eb3634b77115c91874c088ea7f.png

本篇将带你快速了解Spring事务管理以及面向切面编程(AOP)相关知识。

5a68204963d13715dbd522b3a0e9c20a.jpeg

一、事务

1、概述

1)事务是一组操作的集合,是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败。

2)事务作用︰在数据层保障一系列的数据库操作同成功同失败

3)Spring事务作用︰在数据层或业务层保障一系列的数据库操作同成功同失败

2、事务操作

1)开启事务: start transaction / begin;

一组操作开始前,开启事务

2)提交事务: commit;

一组操作全部成功后,提交事务

3)回滚事务: rollback;

中间任何一个操作出现异常,回滚事务

3、事务管理

1)注解: @Transactional

2)位置: 业务(service)层的方法上、类上、接口上

3)作用: 将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务

2e2fdd0c24ce68b275bb52ec9e6d1e21.jpeg

4)开启事务管理日志

#开启事务管理日志
logging:
  level:
    org.springframework.jdbc.support.JdbcTransactionManager: debug

5)几点注意

Spring注解式事务通常添加在业务层接口中而不会添加到业务层实现类中,降低耦合

注解式事务可以添加到业务方法上表示当前方法开启事务,也可以添加到接口上表示当前接口所有方法开启事务

注:Mybatis框架使用的是JDBC事务

4、相关属性

4.1 rollbackFor

rollbackFor属性用于控制出现何种异常类型,回滚事务。

默认情况下,只有出现RuntimeException才回滚异常。

如下配置所有的异常都会回滚异常

@Transactional(rollbackFor = Exception.class)
    @Override
    public void delete(Integer id) throws Exception{
        deptMapper.deteById(id); // 删除部门
        if(true){ // 永远成立,会抛出如下异常(非运行时异常)
            throw new Exception("出错了~");
        }
        empMapper.deleteByDeptId(id); // 删除部门下的员工
    }
4.2 传播行为

重点掌握前两个即可

2ae815071f8627db860639b3069957cc.png

REQUIRED: 大部分情况下都是用该传播行为。

REQUIRES_NEW: 当不希望事务之间相互影响时,可以使用该传播行为。如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录成功。

517c07c43eb03b0081c1c5daf7254dad.png

二、AOP

1、概述

AOP(Aspect Oriented Programming),面向切面编程,一种编程范式,指导开发者如何组织程序结构。

注意将我们之前学的面向对象区分开,OOP(Object oriented Programming),面向对象编程

AOP的本质:代理模式

作用:在不惊动原始设计的基础上为其进行功能增强

Spring理念:无入侵式/无侵入式

2、入门程序

以统计各个业务层方法执行耗时为例。

1)导入依赖: 在pom.xml中引入AOP依赖

<!-- 引入AOP依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2)编写AOP程序

e7e9b2cdae6a58751dc353d0cb0fed1d.png

AOP的应用场景:1、记录操作日志 2、权限控制 3、事务管理,等等

AOP优点:1、代码无侵入 2、减少重复代码 3、提高开发效率 4、方便维护

3、核心概念

1)连接点( JoinPoint ):程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等

在SpringAOP中,理解为方法的执行

2)切入点( Pointcut ):匹配连接点的式子

在SpringAOP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法

一个具体方法:如 com.itweb.dao包下的BookDao接口中的无形参无返回值的save方法

匹配多个方法:如所有的save方法,所有的get开头的方法,所有以Dao结尾的接口中的任意方法,所有带有一个参数的方法

1a9a6dc5f75a16a7be98d5036c2f6d6e.jpeg

3)通知( Advice ):在切入点处执行的操作,也就是共性功能

在SpringAOP中,功能最终以方法的形式呈现

通知类:定义通知的类

4)切面(Aspect ):描述通知与切入点的对应关系

5)目标对象(Target):通知所应用的对象

27ee4235927d5c487aef649d8ae027e6.jpeg

6)AOP执行流程

32544b6ca2fca29a3a3ecda0f2f77a7c.jpeg

4、进阶

4.1 AOP-通知类型

1)AOP通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置

MyBatis的动态SQL也用到了共性抽取理念。

2)5种通知类型

1、前置通知(@Before):该注解标注的通知方法在目标方法前被执行

2、后置通知(@After):此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行。类似与异常处理的 finally语句

3、环绕通知(@Around--重点:此注解标注的通知方法在目标方法前、后都被执行

4、返回后通知(@AfterReturning)--了解

5、抛出异常后通知(@AfterThrowing)--了解

4.2 Around

注意事项

1)环绕通知必须依赖形参ProceedingJoinPoint才能实现对原始方法的调用,进而实现原始方法调用前后同时添加通知

2)通知中如果未使用ProceedingJoinPoint对原始方法进行调用将跳过原始方法的执行

3)对原始方法的调用可以不接收返回值,通知方法设置成void即可,如果接收返回值,必须设定为Object类型

4)原始方法的返回值如果是void类型,通知方法的返回值类型可以设置成void,也可以设置成Object

5)由于无法预知原始方法运行后是否会抛出异常,因此环绕通知方法必须抛出Throwable对象

示例

@Around("pt()")
    public around(ProceedingJoinPoint pjp) throws Throwable { // 抛出异常
        System.out.println("around before advice...");
        Object ret = pjp.proceed(); // 调用原始操作
        System.out.println("around after advice...");
        return ret;
    }
4.3 通知顺序(了解)

1)背景

当有多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行。那么执行顺序是怎么样的?

2)顺序规则

不同切面类中,默认按照切面类的类名字母排序:

目标方法前的通知方法: 字母排名靠前的先执行

目标方法后的通知方法: 字母排名靠前的后执行

3)改变顺序

法1:手动更改类名(繁琐)

法2:@Order(数字),加在切面类上来控制顺序(推荐)

目标方法前的通知方法: 数字小的先执行 目标方法后的通知方法: 数字小的后执行

4.4 常见切入点表达式

所谓切入点表达式,就是描述切入点方法的一种表达式。其主要用来决定项目中的哪些方法需要加入通知。

1)execution(最常用)

语法形式:

execution(访问修饰符 返回值 包名.类名.方法名(方法参数) throws 异常)

其中访问修饰符(如 public,protected),包名.类名.throws 异常,这些可以省略,但是不建议将包名.类名.省略,防止匹配范围过大而影响匹配效率。

通配符:可用于描述切入点

590d6870b467b03d5d89382ad442caaf.png

注:可以使用且(&&)、或(||)、非(!)来组合比较复杂的切入点表达式。

书写规范:

所有业务方法名在命名时尽量规范,方便切入点表达式快速匹配。如: 查询类方法都是find 开头,更新类方法都是update开头。

描述切入点方法通常基于接口描述,而不是直接描述实现类,增强拓展性(当接口的实现类改变时无需改变切入点方法)

在满足业务需要的前提下,尽量缩小切入点的匹配范围,提高匹配效率。如: 包名匹配尽量使用 *匹配单个包,而不使用..。

2)@annotation

annotation切入点表达式,用于匹配标识有特定注解的方法。

用法:@annotation(注解全类名),用法相比 execution更加灵活

@annotation(com.itweb.anno.Log)
@Before ("@annotation (com.itweb.anno.Log)")
public void before (){
    log.info ("before ....");
}
4.5 连接点

在Spring中用JoinPoint抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等。

616672408bbf0bc872ae8ac12b7ee603.png

对于@Around通知,获取连接点信息只能使ProceedingJoinPoint

对于其他四种通知,获取连接点信息只能使用JoinPoint ,它是 ProceedingJoinPoint的父类型

6604f6a0c3c2b9dc6cc18e86bffa7248.png

63393066fda46af087a41431300837c3.gif

喜欢就点击上方关注我们吧!

45a8a2a375abd0812106695005232e93.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/506935.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

八股 -- C#

面向对象 &#xff08;三大特性&#xff09; 三大特性目的是为了提供更好的代码组织、可维护性、扩展性和重用性 C#基础——面向对象 - 知乎 (zhihu.com) 封装 理解&#xff1a; 你不需要了解这个方法里面写了什么代码&#xff0c;你只需要了解这个方法能够给你返回什么数据&…

矩阵乘法优化:GEMM中如何将大矩阵切割成小矩阵

论文自然还是 Anatomy of High-Performance Matrix Multiplication。 如何拆分 一个矩阵乘法有 6 种拆分方式&#xff0c;其中对 row-major 效率最高的是&#xff1a; 第一次拆分 先做第一次拆分&#xff0c;取 A 的 kc 列&#xff08;PanelA&#xff09;和 B 的 kc 行&…

基于 7 大城市实景数据,清华大学团队开源 GPD 模型

城市&#xff0c;是人们安居乐业的故土&#xff0c;是政府开展经济建设的基石&#xff0c;承载着细腻的人文情怀与宏伟的国家发展脉络。长期以来&#xff0c;管理者一直在探寻更加高效、科学的城市治理方法&#xff0c;解决不同地区资源供给不平衡、交通拥挤、人口流失等问题。…

Qt项目通过.pri文件将众多文件按功能模块分类显示,开发大型项目必备

Chapter1 Qt项目通过.pri文件将众多文件按功能模块分类显示&#xff0c;开发大型项目必备 Chapter2 在Qt项目中添加pri文件 原文链接&#xff1a;在Qt项目中添加pri文件_qtpri-CSDN博客 前言 一般我们创建Qt项目工程的时候&#xff0c;都是直接把所有的项目&#xff0c;头文…

Chatopera 云服务的智能问答引擎实现原理,如何融合 #聊天机器人 技术 #Chatbot #AI #NLP

观看视频 Bilibili: https://www.bilibili.com/video/BV1pZ421q7EH/YouTube: https://www.youtube.com/watch?vx0d1_0HQa8o 内容大纲 提前在浏览器打开网址&#xff1a; Chatopera 云服务&#xff1a;https://bot.chatopera.comChatopera 入门教程&#xff1a;https://dwz…

微机原理-基于8086电压报警器系统仿真设计

**单片机设计介绍&#xff0c;微机原理-基于8086电压报警器系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于8086的电压报警器系统仿真设计概要主要涉及到系统的整体架构设计、硬件组成、软件逻辑设计以及仿真环境…

【智能算法】黄金正弦算法(GSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2017年&#xff0c;Tanyildizi等人受到正弦函数单位圆内扫描启发&#xff0c;提出了黄金正弦算法&#xff08;Golden Sine Algorithm, GSA&#xff09;。 2.算法原理 2.1算法思想 GSA来源于正弦函…

前端学习<二>CSS基础——14-CSS3属性详解:Web字体

前言 开发人员可以为自已的网页指定特殊的字体&#xff08;将指定字体提前下载到站点中&#xff09;&#xff0c;无需考虑用户电脑上是否安装了此特殊字体。从此&#xff0c;把特殊字体处理成图片的方式便成为了过去。 支持程度比较好&#xff0c;甚至 IE 低版本的浏览器也能…

C语言内存函数(超详解)

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 点击主页&#xff1a;optimistic_chen和专栏&#xff1a;c语言&#xff0c; 创作不易&#xff0c;大佬们点赞鼓…

安全用电监控系统在工厂的研究与应用论述

摘 要&#xff1a;随着社会时代的发展&#xff0c;人们的安全意识越来越强烈&#xff0c;在人们生活和工作中离不开各种用电设备&#xff0c;用电设备的安全使用是保障人们生命安全的重要内容。工厂因自身厂内工作环境的特殊性&#xff0c;用电设备的种类多且复杂&#xff0c;如…

【数据结构与算法初阶(c语言)】插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序-全梳理(万字详解,干货满满,建议三连收藏)

目录 1.排序的概念及其运用 1.1排序的概念 1.2排序运用 1.3常见的排序算法 2.插入排序 2.1 原理演示&#xff1a;​编辑 2.2 算法实现 2.3 算法的时间复杂度和空间复杂度分析 3.希尔排序 3.1算法思想 3.2原理演示 3.3代码实现 3.4希尔算法的时间复杂度 4.冒泡排序 4.1冒泡排…

二、图的表示和带权图

文章目录 1、图的表示1.1 邻接矩阵1.2 邻接表1.3 关联矩阵 2、带权图2.1 最短路径问题2.2 中国邮递员问题2.3 旅行商问题 THE END 1、图的表示 1.1 邻接矩阵 \qquad 将图的所有顶点分别构成一个二维矩阵的行列&#xff0c;将顶点之间的边关系表示在构成的矩阵之中&#xff0c;…

在CentOS 8.5.2111下安装vncserver

# 参考&#xff1a; 如何在 CentOS 8/RHEL 8 上安装配置 VNC 服务器 安装CentOS 8.5.2111 及 vncserver # 标准安装步骤 安装GNOME桌面环境使用屏幕号:1。安装VNC服务器&#xff08;tigervnc-server tigervnc&#xff09;设置VNC密码设置VNC服务器配置文件开启vnc服务。开放防…

FX110网:货币交易5个亏损典型,你有中招吗?

人生百年几今日&#xff0c;今日不为真可惜&#xff01;若言姑待明朝至&#xff0c;明朝又有明朝事。很多投资朋友总是抱怨&#xff0c;为什么总是看见别人赚钱&#xff0c;自己一进场就亏损&#xff0c;那么在这里投资失败无非两点&#xff1a;一是自身原因&#xff0c;自己没…

SAP 销售分销中的免费货物

销售业务中&#xff0c;免费货物在您与客户协商价格时起着重要作用。在零售、化工或消费品这样的行业部门中&#xff0c;通常以免费货物的形式向客户提供折扣。 作为用户&#xff0c;业务用户希望能自动确定免费货物并将它们归入销售凭证中。同时需要向成本控制部门提供免费货物…

密码算法概论

基本概念 什么是密码学&#xff1f; 简单来说&#xff0c;密码学就是研究编制密码和破译密码的技术科学 例题&#xff1a; 密码学的三个阶段 古代到1949年&#xff1a;具有艺术性的科学1949到1975年&#xff1a;IBM制定了加密标准DES1976至今&#xff1a;1976年开创了公钥密…

盘点那些好用的SAP FIORI App(一) Display Customer/Supplier List

做SAP运维的人可能都知道&#xff0c;SAP标准的菜单里面基本没有好用的report可以用来批量显示并导出客户清单&#xff0c;或者供应商清单。T-code MKVZ 可以导出供应商的采购数据&#xff0c;但仅限于部分字段&#xff0c;客户清单的话系统标准的有这个S_ALR_87012179 - Custo…

电脑端手机配置检测工具推荐与使用指南

摘要 本文介绍了如何使用克魔助手工具在电脑上检测手机的配置信息。通过该工具&#xff0c;用户可以全面了解手机的硬件和操作系统信息&#xff0c;包括电池、CPU、内存、基带信息和销售信息等。 引言 在日常工作中&#xff0c;了解手机的配置信息对于开发和测试人员非常重要…

算法刷题笔记(3.25-3.29)

算法刷题笔记 3.25-3.29 1. 相同的树2. 二叉树的最近公共祖先3. 二叉搜索树中第K小的元素通过双端队列duque 中序遍历 4. 二叉树的锯齿形层序遍历new LinkedList<Integer>(levelList)双端队列复制 数组需要左右顺序&#xff0c;考虑双端队列 5. 岛屿数量6. 字典序排数&am…

【应用浅谈】Odoo的库存计价与产品成本(一)

序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo的库存&#xff08;Stock&#xff09;模块拥有众多功能&#xff0c;其中库存计价是一项非常重要的功能&#xff0c;原生的成本方法分三种&#xff1a;【标准成本】&#xff0c;【平均成本】&#xff0c;【先进先出】&#…