当前位置: 首页 > news >正文

事务管理AOP

事务管理

事务回顾

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

操作:

        开启事务:一组操作开始前,开启事务-start  transaction/begin

        提交事务:这组操作全部成功后,提交事务-commit

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

Spring事务管理

注解:@Transactional

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

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

事务进阶

事务属性-回滚

rollbackFor

        默认情况下,只有出现RuntimeException(运行时异常)才回滚异常,rollbackFor属性用于控制出现何种异常类型,回滚事务。

 事务属性-传播行为

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

REQUIRED:大部分情况下都是该传播行为即可

REQUIRES_NEW:当我们不希望事务之间相互影响时,可以使用该传播行为。

AOP基础

AOP概述

AOP:面向切面编程,其实就是面向特定方法编程

实现:动态代理是面向切面编程最主流的实现。而SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定的方法进行编程

AOP快速入门

Spring AOP快速入门,统计各个业务层方法执行耗时

导入依赖:

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

 编写AOP程序:针对于特定方法根据业务需要进行编程

package com.itheima.aop;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@Aspect //AOP类
public class TimeAspect {@Around("execution(* com.itheima.service.*.*(..))")//切入点表达式public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {long begin = System.currentTimeMillis();Object result = joinPoint.proceed();long end = System.currentTimeMillis();log.info(joinPoint.getSignature() + "方法执行耗时:{}ms", end - begin);return result;}
}

 场景:记录日志、权限控制、事务管理

优势:代码无入侵、减少重复代码、提高开发效率、维护方便

AOP核心概念

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

通知:Advice,指那些重复的逻辑,也就是共性功能(最终体现为一个方法)

切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用

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

目标对象:Target,通知所应用的对象

 

AOP进阶

通知类型

@Around:环绕通知,此注解标注的通知方法在目标方法前、后都被执行

@Before:前置通知,此注解标注的通知方法在目标方法前被执行

@After:后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行

@AfterRetureing:返回后通知,此注解的通知方法在目标方法之后被执行,有异常不会执行

@AfterThrowing:异常后通知,此注解标注的通知方法发生异常后执行

注意:@Around环绕通知需要自己调用Proceeding Join Point.proceed()来让原始方法执行,其他通知不需要考虑目标方法执行

@Around环绕通知方法的返回值,必须指定为Object,来接受原始方法的返回值。

package com.itheima.aop;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Slf4j
@Component
@Aspectpublic class MyAspect1 {@Pointcut("execution(* com.itheima.controller.*(..))")private void pt() {}@Before("pt()")public void Before() {log.info("before...");}@After("pt()")public void After() {log.info("before...");}@Around("pt()")public Object Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {log.info("around.....before");Object proceed = proceedingJoinPoint.proceed();log.info("around.....after");return proceed;}@AfterReturning("pt()")public void AfterReturning() {log.info("before...");}@AfterThrowing("execution(* com.itheima.controller.*(..))")public void AfterThrowing() {log.info("before...");}}

 @PointCut

        该注解的作用式将公共的切点表达式抽取出来,需要用到时引用该切点表达式即可

通知顺序

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

 执行顺序:

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

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

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

        2.用@Order(数字)加在切面类上来控制顺序

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

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

切入点表达式

描述切入点方法的一种表达式

作用:主要用来决定项目中的那些方法需要加入通知

常见形式:

        execution(....):根据方法的签名来匹配

@AfterThrowing("execution(* com.itheima.controller.*(..))")public void AfterThrowing() {

 execution主要根据方法的返回值、包名、类名、方法名、方法参数等信息来匹配,语法为:

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

        访问修饰符:可省略

        包名、类名:可省略

        throws异常:可省略

 书写建议:

        所有业务方法名在命名时尽量规范,方便切入点表达式快速匹配

        描述切入点方法通常基于接口描述,而不是之间描述实现类,增强拓展性

        在满足业务需要的前提下,尽量缩小切入点的匹配范围

         @annotation(....):根据注解匹配

@Before("@annotation(com.itheima.controller.DeptController)")public void before() {

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

连接点

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

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

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

相关文章:

事务管理AOP

事务管理 事务回顾 概念&#xff1a;事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;这些操作要么同时成功&#xff0c;要么同时失败 操作&#xff1a; 开启事务&#xff1a;一组操作开始前&#xff0c;开启事务&#xff0d;start transaction/be…...

Java从Tif中抽取最大的那张图进行裁剪成x*y份

之前我有一篇帖子《kfb格式文件转jpg格式》讲述到 kfb > tif > jpg&#xff0c;但是针对于超大tif中的大图是无法顺利提取的&#xff0c;就算是能顺利提取&#xff0c;试想一下&#xff0c;2G的tif文件&#xff0c;如果能提取处理最大的那张图&#xff0c;并且在不压缩的…...

人工智能AI界的龙头企业,炸裂的“英伟达”时代能走多远

原创 | 文 BFT机器人 1、AI芯片的竞争格局已趋白热化 尽管各类具有不同功能和定位的AI芯片在一定程度上可实现互补&#xff0c;但同时也在机遇与挑战并存中持续调整定位。在AI训练端&#xff0c;英伟达的GPU凭着高算力的门槛&#xff0c;一直都是训练端的首选。 只有少数芯片能…...

【实战】H5 页面同时适配 PC 移动端 —— 旋转横屏

文章目录 一、场景二、方案三、书单推荐01 《深入实践Kotlin元编程》02 《Spring Boot学习指南》03 《Kotlin编程实战》 一、场景 一个做数据监控的单页面&#xff0c;页面主要内容是一个整体必须是宽屏才能正常展示&#xff0c;这时就不能用传统的适配方案了&#xff0c;需要…...

使用凌鲨进行聚合搜索

作为研发人员&#xff0c;我们经常需要在多个来源之间查找信息&#xff0c;以便进行研发工作。除了常用的搜索引擎如百度和必应之外&#xff0c;我们还需要查阅各种代码文档和依赖包等资源。这些资源通常分散在各个网站和文档库中&#xff0c;需要花费一定的时间和精力才能找到…...

程序设计之——手把手教你如何从Excel文件中读取学生信息

在当今信息化时代&#xff0c;计算机技术已经深入到各个领域&#xff0c;而程序设计则成为推动信息化建设的关键技术之一。在众多领域中&#xff0c;学生信息管理系统无疑是其中一个重要的应用。本文将从学生信息管理系统的开发入手&#xff0c;探讨开如何高效且保证质量的完成…...

Docker容器化技术(从零学会Docker)

文章目录 前言一、初识Docker1.初识Docker-Docker概述2.初识Docker-安装Docker3.初识Docker-Docker架构4.初识Docker-配置镜像加速器 二、Docker命令1.Docker命令-服务相关命令2.Docker命令-镜像相关命令3.Docker命令-容器相关命令 三、Docker容器的数据卷1.Docker容器数据卷-数…...

【新版】系统架构设计师 - 案例分析 - 总览

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 架构 - 案例分析 - 总览 新旧大纲对应 旧版新版系统规划软件架构设计设计模式系统设计系统建模分布式系统设计嵌入式系统设计系统的可靠性分析与设计系统的安全性和保密性设计系统计划信息系统架构的设计理论和实…...

【Git】02-Git常见应用

文章目录 1. 删除不需要分支2. 修改最新Commit的Message3. 修改之前Commit的Message4. 连续多个Commit整理为一个5. 不连续的Commit整理为一个6. 比较暂存区和HEAD中文件差异7. 比较工作区和暂存区中文件差异8. 将暂存区恢复为HEAD相同9. 工作区文件恢复和暂存区相同10. 取消暂…...

YOLO物体检测-系列教程2:YOLOV2整体解读

&#x1f388;&#x1f388;&#x1f388;YOLO 系列教程 总目录 YOLOV1整体解读 YOLOV2整体解读 YOLOV2提出论文&#xff1a;YOLO9000: Better, Faster, Stronger 1、YOLOV1 优点&#xff1a;快速&#xff0c;简单&#xff01;问题1&#xff1a;每个Cell只预测一个类别&…...

u盘传输数据的时候拔出会怎么样?小心这些危害

U盘是我们日常生活和工作中常使用的一种便携式存储设备。然而&#xff0c;在使用U盘传输数据时&#xff0c;有时我们会不小心将它拔出&#xff0c;而这个看似微不足道的行为实际上可能会带来严重的后果。本文将向您介绍U盘在传输数据时突然拔出可能导致的各种危害&#xff0c;其…...

【踩坑纪实】URL 特殊字符 400 异常

URL 特殊字符 400 异常 笔者之前在写后端或者前端时&#xff0c;在处理表单时&#xff0c;经常有对特殊字符的检验处理&#xff0c;但自己也不清楚为什么要这么做&#xff0c;浅浅地以为可能是特殊字符不好看或者存取可能会造成异常&#xff1f;不过一直没遇到过问题&#xff…...

Contents:帮助公司为营销目的创建内容

【产品介绍】 名称 Contents上线时间 2017年5月 具体描述 Contents是一家提供基于人工智能的内容生成平台的企业&#xff0c;可以帮助用户在各种网站和工具中使用最先进的机器学习模型&#xff0c;实现视频编辑、图像生成、3D建模等内容创作。【团队介绍…...

1397: 图的遍历——广度优先搜索

题目描述 广度优先搜索遍历类似于树的按层次遍历的过程。其过程为&#xff1a;假设从图中的某顶点v出发&#xff0c;在访问了v之后依次访问v的各个未曾被访问过的邻接点&#xff0c;然后分别从这些邻接点出发依次访问它们的邻接点&#xff0c;并使“先被访问的顶点的邻接点”先…...

Java 华为真题-选修课

需求&#xff1a; 现有两门选修课&#xff0c;每门选修课都有一部分学生选修&#xff0c;每个学生都有选修课的成绩&#xff0c;需要你找出同时选修了两门选修课的学生&#xff0c;先按照班级进行划分&#xff0c;班级编号小的先输出&#xff0c;每个班级按照两门选修课成绩和的…...

Invalid access token: Invalid header string: ‘utf-8‘ codec can‘t decode byte

报错&#xff1a;在运行一个txt文档时报Invalid access token: Invalid header string: ‘utf-8’ codec can’t decode byte 原因&#xff1a;文档编码方式的原因&#xff0c;电脑默认的是UFT-8格式的编码 解决方法&#xff1a;用notepad改一下文档编码就好...

Java 中将多个 PDF 文件合并为一个 PDF

一.前言 我们将从以下两个方面向您展示如何将多个PDF文件合并为一个PDF&#xff1a; 1. 将文件中的多个 PDF 合并为单个 PDF 2. 将流中的多个 PDF 合并为单个 PDF 1. 了解 Spire.PDF 库 要在 Java 中合并 PDF 文件&#xff0c;我们将使用Spire.PDF 库。Spire.PDF for Java 是…...

python经典百题之水仙花数

题目&#xff1a;打印出所有的“水仙花数”&#xff0c;所谓“水仙花数”是指一个三位数&#xff0c;其各位数字立方和等于该数 本身。例如&#xff1a;153是一个“水仙花数”&#xff0c;因为1531的三次方&#xff0b;5的三次方&#xff0b;3的三次方。 方法一&#xff1a;暴…...

jvm的调优工具

1. jps 查看进程信息 2. jstack 查看进程的线程 59560为进程id 产生了死锁就可以jstack查看了 详细用途可以看用途 3. jmap 如何使用dump文件看下 查看 4.jstat 空间占用和次数 5. jconsole可视化工具 各种使用情况&#xff0c;以及死锁检测 6. visualvm可视化工具…...

C语言--字符串旋转笔试题

C语言–字符串旋转笔试题 文章目录 C语言--字符串旋转笔试题一、字符串左旋1.1 思路11.2 思路1代码1.3 思路21.4 思路2代码 二、字符串旋转结果判断2.1 思路12.2 思路2 一、字符串左旋 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; ABCD左旋一个字…...

ARM调试异常与调试状态机制详解

1. ARM调试异常机制深度解析调试异常是ARM处理器调试体系中的核心机制&#xff0c;当处理器在监控调试模式(Monitor debug-mode)下发生特定调试事件时触发。理解这一机制对于嵌入式系统开发至关重要&#xff0c;它直接影响着断点设置、单步调试等基础调试功能的实现效果。1.1 调…...

商家怎么弄小程序店铺

去年10月有个做茶叶生意的武夷山商家找到我&#xff0c;说要弄个小程序店铺。我问他需求是什么&#xff0c;他说"就是能让客户在线买茶"。听起来简单&#xff0c;但实际做下来&#xff0c;整个过程走了不少弯路。我把时间线记录下来&#xff0c;给要弄小程序店铺的商…...

JAVA:类和对象完全解析

一、编程世界的乐高积木在面向对象编程&#xff08;OOP&#xff09;的宇宙中&#xff0c;类&#xff08;Class&#xff09;和对象&#xff08;Object&#xff09;如同乐高积木的基础模块。如果把程序看作一个虚拟城市&#xff0c;类就是建筑设计图&#xff0c;而对象则是根据图…...

基于Anylogic仿真的地铁换乘站客流瓶颈识别与疏导策略——以成都春熙路站为例

1. 为什么需要仿真技术解决地铁换乘站拥堵问题 每天早高峰挤地铁的朋友们一定深有体会&#xff0c;特别是像成都春熙路这样的换乘大站&#xff0c;站台上人挤人、通道里水泄不通的场景简直让人崩溃。作为成都地铁2号线和3号线的换乘枢纽&#xff0c;春熙路站日均客流量超过30万…...

解锁HexView自动化:Bat脚本驱动S19/HEX文件处理实战

1. 为什么需要自动化处理S19/HEX文件 在汽车电子开发领域&#xff0c;我们经常需要处理各种固件文件&#xff0c;比如S19、HEX等格式。这些文件包含了嵌入式系统的机器代码&#xff0c;是软件最终要烧录到芯片中的形态。每次软件更新时&#xff0c;开发人员都要对这些文件进行一…...

【Claude Code 源码解析教程】第33章:性能调优实战

本章深入解析 Claude Code 的性能优化策略,包括内存优化、响应速度优化、缓存策略和并发处理。性能优化是提升用户体验的关键。 目录 33.1 内存优化策略 33.1.1 慢操作监控 33.1.2 慢操作检测使用示例 33.1.3 内存管理策略 33.1.4 内存泄漏检测与修复 33.2 响应速度优化…...

基于Gemini与Elasticsearch构建智能数据查询命令行工具

1. 项目概述&#xff1a;当Elasticsearch遇见Gemini&#xff0c;一个命令行智能体的诞生 最近在开源社区里闲逛&#xff0c;发现了一个挺有意思的项目&#xff1a; elastic/gemini-cli-elasticsearch 。光看这个名字&#xff0c;就能嗅到一股“强强联合”的味道。Elasticsea…...

NotebookLM无法识别PDF表格?手把手复现Google Research 2024最新LayoutParser适配方案(附可运行Colab脚本)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM无法识别PDF表格&#xff1f;手把手复现Google Research 2024最新LayoutParser适配方案&#xff08;附可运行Colab脚本&#xff09; NotebookLM 默认使用轻量级 PDF 解析器&#xff08;如 Py…...

告别重复图片困扰:AntiDupl.NET 智能图片去重工具完全指南

告别重复图片困扰&#xff1a;AntiDupl.NET 智能图片去重工具完全指南 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾因电脑中堆积如山的重复图片而感到困扰&…...

5分钟快速上手Sonar CNES Report:让代码质量报告变得简单高效

5分钟快速上手Sonar CNES Report&#xff1a;让代码质量报告变得简单高效 【免费下载链接】sonar-cnes-report Generates analysis reports from SonarQube web API. 项目地址: https://gitcode.com/gh_mirrors/so/sonar-cnes-report 你是否经历过这样的场景&#xff1f…...