SpringBoot:事务和AOP

事务

一组操作的集合,不可分割的工作单位,会被一起提交或撤销

要么同时成功,要么同时失败

实物操作

begin/start transaction 开启事务

commit 提交事务

rollback 回滚事务

eg:当我们需要保证数据的一致性,例如在删除时,删除了部门,却没有删除部门的员工,就会出现数据的不一致

此时就需要使用事务

Spring事务管理

@Transactional

在业务(service)层的方法,类,接口上

将当前方法交给Spring进行事务管理,执行前开启事务,成功执行提交事务,出现异常回滚事务.


事务进阶

rollbackfor

@Transactional的一个属性,接收异常的字节码文件

可以控制在什么异常类型下会回滚事务,默认情况下会在RuntimeException下回滚事务.

在任意异常下回滚事务:

@Transactional(rollbackFor = Exception.class)
propagation

@Transactional的一个属性,接收事务的传播行为方式

事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制.

如果没有配置事务传播行为,则默认事务传播行为为REQUIRED,如果多个方法的事务传播行为相同就可以进行统一的提交和回滚.

配置事务行为
REQUIRE(常用)
//默认值,需要事务,有就加入,没有就创建新事务
REQUIRE_NEW(常用)
//需要新事务,无论有无,总是创建新事务
SUPPORTS
//支持事务,有则加入,没有就在独立连接中运行SQL
NOT_SUPPORTED
//不支持事务,不加入,在独立连接中运行SQL
MANDATORY
//必须有事务,否则抛出异常
NEVER
//必须没有事务,否则抛出异常
NESTED
//嵌套事务(仅对DataSourseTransactionManager有效)

REQUIRED:在大部分情况下适用

REQUIRED_NEW:不希望事务之间相互影响时使用

AOP

Aspect Oriented Programming(面向切面编程)

将重复的逻辑剥离出来,在不修改原始逻辑的基础上对原始功能进行增强

无侵入,减少重复代码,提高开发效率,维护方便
定义类抽取公共代码
@Aspect
标识AOP类,并且将这个类交给Spring容器管理
@Component
配置公共代码作用的方法

@Around:环绕通知

在目标方法执行前后执行公共代码

任意 *

任意参数 …


执行目标方法

使用动态代理实现AOP

当目标对象功能需要被增强时,并且我们使用AOP方式在Aspect类中定义了增强逻辑

Spring会为目标对象自动生成一个代理对象,并在代理对象对应方法中结合我们定义的AOP增强逻辑完成功能增强.


AOP核心概念

连接点:JoinPoint(可以被AOP控制的方法执行)包含方法信息

通知:Advice,重复逻辑代码

切入点:PointCut,匹配连接点的条件(execution…)

切面:Aspect,通知+切点

AOP进阶

通知类型

@Around
//此注解标注的通知方法在目标方法前后都执行
//需要自己调用ProceedingJoinPoint.proceed()方法来让目标方法执行
@Before
//此注解标注的通知方法在目标方法前被执行
@After
//此注解标注的通知方法在目标方法后被执行,无论是否存在异常
(finally块中)
@AfterReturning
//同上,但有异常时不会执行,后于@After执行
@AfterThrowing
//在发生异常后执行

AOP通知顺序

当多个切面的切点都匹配目标时,多个通知方法都会被执行

默认按照类名字母排序
用@Order(数字)加在切面类上来控制顺序

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

目标后的通知方法:数字大先执行 降序

顺序类似于进栈出栈

切点表达式

execution(返回值类型 包名 类名 方法名(参数类型))

@annotation()根据注解匹配

args()根据方法匹配

execution

根据方法的返回值,包名,类名,方法名,方法参数等信息来匹配

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

访问修饰符可省略

包名.类名可省略

throws异常:可省略(声明中抛出的异常而非方法实际抛出的异常)

annotation

切点表达式也支持匹配目标方法是否存在注解

使用@annotation

@annotation(com.itheima.anno.Log)

@Pointcut

抽取一个切入点表达式,在其他地方通过类似调用的形式对其进行引用

@Pointcut(切入点)
public void function()@After("function()")

连接点

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

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

对应其他四种通知只能使用JoinPoint,即ProceedingJoinPoint的父类型

//获取类名
getTarget().getClass().getName()
//获取方法名
getSignature().getName()
//获取参数(返回一个Object数组)
getArgs()

案例

@Aspect
@Component
public class aspect {@AutowiredLogMapper logMapper;@AutowiredLoginControllerImpl loginController;@Around("execution(* com.example.tlias.service.Impl.*.*(..))")public Object caltime(ProceedingJoinPoint jp) throws Throwable{Logs logs = new Logs();Long start = System.currentTimeMillis();Object returns = jp.proceed();Long end = System.currentTimeMillis();System.out.println("时间" + (end - start));logs.setTime(end-start);logs.setFunctionName(jp.getSignature().getName());logs.setClassName(jp.getTarget().getClass().getName());logs.setReturns(JSONObject.toJSONString(returns));logs.setArgs(jp.getArgs().toString());logs.setUser(loginController.id);System.out.println("当前用户:" + logs.getUser());logs.setOpTime(LocalDateTime.now());logMapper.insert(logs);return returns;}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源模型应用落地-模型记忆增强-概念篇(一)

一、前言 语言模型的记忆是基于其训练数据。具体而言,对于较长的文本,模型可能会遗忘较早的信息,因为它的记忆是有限的,并且更容易受到最近出现的内容的影响。模型无法跨越其固定的上下文窗口,而是根据当前上下文生成回应。 提升模型记忆能力有多种方法,比如改进模型的结…

Leetcode—295. 数据流的中位数【困难】

2024每日刷题&#xff08;132&#xff09; Leetcode—295. 数据流的中位数 实现代码 class MedianFinder { public:MedianFinder() {}void addNum(int num) {if(maxHeap.empty() || num < maxHeap.top()) {maxHeap.push(num);} else {minHeap.push(num);}if(maxHeap.size(…

未授权访问:Jenkins未授权访问漏洞

目录 1、漏洞原理 2、环境搭建 3、未授权访问 4、利用未授权访问写入webshell 防御手段 今天继续学习各种未授权访问的知识和相关的实操实验&#xff0c;一共有好多篇&#xff0c;内容主要是参考先知社区的一位大佬的关于未授权访问的好文章&#xff0c;还有其他大佬总结好…

基于JSP动漫论坛的设计与实现(二)

目录 3. 系统开发环境及技术介绍 3.1 开发环境 3.2 开发工具 3.2.1 MyEclipse8.5 3.2.2 MySql 3.3 相关技术介绍 3.3.1 JSP技术简介 3.3.2 JDBC技术技术简介 3.3.3 MVC模式与Struts框架技术 4. 总体设计 4.1 系统模块总体设计 4.1.1 普通用户模块设计 4…

常见的获取dom元素的方法

获取 DOM 元素是前端开发中非常常见的操作。以下是几种常用的方法来获取 DOM 元素&#xff0c;以及它们的适用场景和示例&#xff1a; 1. getElementById 用于获取具有指定 id 属性的元素。 示例 let element document.getElementById(myId); 2. getElementsByClassName …

element ui的无法关掉的提示弹框

使用element的$alert组件的属性把X去掉和确定按钮和取消按钮去掉&#xff1b; import { MessageBox } from element-ui; MessageBox.alert(AI功能已到期或暂未开启, 友情提示, {showClose: false,showCancelButton: false,showConfirmButton: false }); 如果在router的路由守…

【QT教程】QT6音视频处理权威指南 QT音视频

QT6音视频处理权威指南 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费…

TrinityCore最新版本master安装@ubuntu22@win10

原名字是&#xff1a;trinitycore最新版本master安装dockerfreebsd15win10 说明一下&#xff0c;原计划是在win10的virtualbox安装FreeBSD&#xff0c;然后在FreeBSD系统安装docker-machine&#xff0c;再安装tinycore-linux&#xff0c;在里面再安装docker&#xff0c;docker…

力扣:204. 计数质数(Java)

目录 题目描述:示例 1&#xff1a;示例 2&#xff1a;代码实现&#xff1a; 题目描述: 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 示例 1&#xff1a; 输入&#xff1a;n 10 输出&#xff1a;4 解释&#xff1a;小于 10 的质数一共有 4 个, 它们是 …

迁移docker存储目录

背景&#xff1a; 使用docker安装mysql&#xff0c;pika&#xff0c;redis后&#xff0c;系统将数据存储到mysql。 一段时间后&#xff0c; mysql经常报 ‘ 空间不足 ’。 后来发现docker存储目录所在的分区磁盘空间不足。所以&#xff0c;考虑迁移docker存储目录。 环境&…

git 常用命令 git怎么撤销命令 持续更新中!!!!

基本流程 # 拉取仓库 git clone 仓库地址 # 拉取最新版本 git pull # 本地提交 git add . git commit -m "本次提交信息&#xff01;" # 推送上云 git push分支 # 创建分支 git checkout -b cart # 删除本机的分支 git branch -d cart # 切换分支 本地切换到主分支…

引入RabbitMQ

前置条件 docker 安装 mq docker run \-e RABBITMQ_DEFAULT_USERdudu \-e RABBITMQ_DEFAULT_PASS123456 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network hmall \-d \rabbitmq:3.8-management可能会出现&#xff1a;docker: Er…

2024HW Linux应急响应基础学习

首先展示关于Linux的关键目录&#xff0c;这是应急响应查看的关键&#xff1a; 常用命令 top //查看进程资源的占用情况 ps -aux //查看进程 直接写ps aux也可以 netstat -antpl //查看网络连接 ls -alh /proc/pid //查看某个pid对应的可执行程序 pid记得修改 lsof /…

华大基因CEPO-尹烨说学习与生活

怎么去面对生活和事业中的不确定性&#xff1f; 尹烨说&#xff0c;人类能够对抗不确定性的唯一的办法是&#xff0c;去让自己充电。 主持人问他&#xff0c;“和你同年的也有很多人&#xff0c;他们也可能也在学习&#xff0c;你怎么就能够脱颖而出呢&#xff1f;” 他说&am…

基于Springboot+Vue+Java的校园资料分享平台

&#x1f49e; 文末获取源码联系 &#x1f649; &#x1f447;&#x1f3fb; 精选专栏推荐收藏订阅 &#x1f447;&#x1f3fb; &#x1f380;《Java 精选实战项目-计算机毕业设计题目推荐-期末大作业》&#x1f618; 更多实战项目~ https://www.yuque.com/liuyixin-rotwn/ei3…

word图片水印

一、word中旧水印如何删除 打开word模板&#xff0c;想要删除旧水印&#xff0c;如下图所示操作&#xff0c;但是旧水印删除不掉。 以为上传新水印图片会替换掉旧水印&#xff0c;结果显示了2个水印&#xff0c;要怎么删除呢&#xff1f; 如下截图所示&#xff0c;双击打开页…

SpringCloud:认识微服务

程序员老茶 &#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; P   S : 点赞是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#…

生成式人工智能岗位探析

笔者近期看到一则新闻&#xff1a;生成式人工智能岗位需求暴涨超 300%&#xff0c;AIGC 相关岗位的平均招聘年薪达 40 万元以上。到底什么是生成式人工智能岗位&#xff0c;和传统的人工智能岗又有什么区别呢&#xff1f;笔者今天想和大家一起聊聊这个新兴岗位。 第一波先上概…

机器学习_KNN算法

机器学习_KNN算法 K-近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;算法是一种基本的机器学习分类和回归算法 其核心思想是&#xff1a;如果一个样本在特征空间中的k个最相似&#xff08;即特征空间中最邻近&#xff09;的样本中的大多数属于某一个类别…

「短链接教程」如何使用自己的域名生成短链接

在当今数字化时代&#xff0c;短链接的应用越来越广泛。它们不仅能让链接更简洁美观&#xff0c;还便于分享和传播。 但很多时候想用自己的域名生成短链接&#xff1f;搭建短链接平台又比较麻烦&#xff0c;所以&#xff0c;这里以C1N短网址(c1n.cn)为例&#xff0c;介绍下如何…