【javaWeb 第十一篇】(Spring )事务管理AOP

news2024/11/20 0:33:21

事务管理&AOP

  • 事务管理
    • Spring事务管理
      • 事务属性rollbackFor
      • 事务属性propagation
  • AOP
    • 快速入门
    • AOP概念
      • AOP的执行流程
    • AOP进阶
      • 通知类型
      • 通知顺序
    • 切入点表达式
      • 切入点表达式-execution
      • 切入点表达式-@annotation
    • 连接点

事务管理

事务:

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

Spring事务管理

案例:删除部门数据表,删除部门,同时删除该部门下的员工
如果在删除的同时,删除了部门没有删除员工就会出现问题,这个时候需要引入事务
在spring中不需要手动来写事务的问题,只需要通过注解 @Transactional
注解的位置:业务层的方法上,类上,接口上
作用:将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务,出现异常,回滚事务

在业务层的方法上,该业务层中多个数据操作方法控制在一个事务当中

在类上进行注解,表示该类中所有的方法都交给spring事务管理

在接口上注解,表示该接口所有实现类的方法都交由spring事务管理

成功注解之后还要在配置文件中配置spring事务管理日志的开关

logging.level.org.springframework.jdbc.support.JdbcTransactionManager=debug

事务属性rollbackFor

注意:在默认情况下,只有出现RuntimeException才会出现回滚异常,rollbackFor属性用于控制出现何种异常类型,回滚事务,如果要指定执行那种异常的时候回滚事务,需要在注解 @Transactional后设置属性rollbackFor的值

@Transactional(rollbackFor= Exception.class) 

事务属性propagation

事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制
事务属性
案例:解散部门时,记录操作日志
需求:解散部门时,无论是成功还是失败,都要记录操作日志

@Transactional
@Override
public void delete(Integer id){
   try{
   deptMapper.deleteByid(id);//删除部门
   int i=1/0;
   empMapper.deleteByid(id);
   }
   finally{
   DeptLog Log= new DeptLog();
   Log.setCreateTime(LocalDateTime.now());
   Log.setDescription("执行了解散部门操作,此次解散的是"+id+"号部门");
   deptLogService.insert(log);// 记录操作日志
   }
}

REQUIRED:大部分情况下都是用该传播行为即可
REQUIRED_NEW:当我们不希望事物之间相互影响时,可以使用该行为传播行为

AOP

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

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

快速入门

统计各个业务层方法的耗时:
导入AOP起步依赖:在pom.xml中导入AOP的依赖

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

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

@Component
@Aspect  //该注解表示当前类是AOP类
@Slf4j
public class TimeAop {
    @Around("execution(* com.example.service.*.*(..))") //切入点表达式
    public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
        //1.记录开始时间
        long begin=System.currentTimeMillis();
        //2.调用原始方法
        Object proceed = joinPoint.proceed();
        //3.记录结束时间,计算方法执行耗时
        long end=System.currentTimeMillis();
        log.info("方法执行的时间:{}ms",end-begin);
        return proceed;
    }
}

通过注解 @Component将该类交予IOC容器管理
通过注解 @Aspect 标定该类是一个AOP类
通过注解 @Around 标定执行的目标方法

AOP的使用场景:记录操作日志,权限控制,事务管理等等
AOP的优点:代码无侵入,减少重复代码,提高开发效率,维护方便

AOP概念

连接点:JoinPoint,可以被AOP控制的方法(暗含方法执行时的相关信息)
通知:Advice,指哪些重复的逻辑,也是共性功能(最终体现为一个方法)
切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用
切面:Aspect,描述通知与切入点的对应关系(通知+切入点)
目标对象:Target,通知所应用的对象

AOP的执行流程

springAOP的底层是基于动态代理的,执行时系统会为目标对象创建一个代理对象,在代理对象中对目标对象进行增强,这个时候在注入这个对象的时候,注入的其实是这个对象的代理对象

AOP进阶

通知类型

  1. @Around: 环绕通知,此注解标注的通知方法在目标方法前后都被执行
  2. @Before: 前置通知,此注解标注的通知方法在目标方法前被执行
  3. @After: 后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行
  4. @AfterReturning :返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行
  5. @AfterThrowing:异常后通知,此注解标注的通知方法发生异常后执行

注意: @Around环绕通知需要自己调用 ProceedingJoinPoint.proceed()来让原始方法执行,其他通知不需要
@Around 环绕通知的返回值,必须指定为Object,来接收原始方法的返回值

当切入点表达式中出现大量重复的表达式的时候:
我们可以通过注解 ==@Pointcut ==来标定重复的切入点表达式

@Point("execution(* com.exemple.service.impl.*(..))")
private void pt(){}

注意:private: 仅能在当前切面类中引用该表达式
public:在其他外部的切面类中也可以引用该表达式
注解下的方法不需要给出方法体,在需要此切入点表达式的时候直接调用就ok
例如:

@Around("pt()")

通知顺序

当有多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行
不同的切面类中,默认按照切面类的类名字母排序:

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

除此之外还能通过 @order(数字) 加在切面类上来控制顺序

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

切入点表达式

作用:主要用来决定项目中的哪些方法需要加入通知
常见形式:
execution(…):根据方法的签名来匹配
@annotation(…):根据注解匹配

切入点表达式-execution

execution主要根据方法的返回值,包名,类名,方法名,方法参数等信息来匹配
语法:execution(访问修饰符? 返回值 包名.类名.?方法名(方法参数) throws 异常?)
其中带?的部分可以省略:
访问修饰符:可省略(比如:public,protected)
包名.类名: 可省略
throws 异常:可省略(注意是方法上抛出的异常,不是实际抛出的异常)
可以使用通配符描述切入点:
*:单个独立的任意符号,可以通配任意返回值,包名,类名,方法名,任意类型的一个参数,也可以通配包,类,方法名的一部分
..:多个连续的任意符号,可以通配任意层级的包,或任意类型,任意个数的参数

注意:根据业务需要,可以使用且(&&),或(||),非(!)来组合比较复杂的切入点表达式

切入点表达式-@annotation

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


@Retention(RetentionPolicy.RUNTIME)  //这个注解用来描述该自定义注解什么时候生效
@Target(ElementType.METHOD) //该注解标识该注解的使用范围,这里标识在方法中
public @interface MyLog {
}

在@Point(“@annotation(自定义注解的全类名注解)”)
在使用该通知的切入点上添加上该自定义的注解即可

连接点

在Spring中用JoinPoint抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名,方法名,方法参数等
对于 @Around通知,获取连接点信息只能使用 ProceedingJoinPoint
对于其他四种通知,获取连接点信息只能使用 JoinPoint,它是ProceedingJoinPoint的父类型


@Component
@Aspect
@Slf4j
public class SendAop {
    @Around("execution(* com.example.service.*.*(..))")
    public Object shishi(ProceedingJoinPoint joinPoint) throws Throwable {
        //1.获取目标对象的类名
        String name = joinPoint.getTarget().getClass().getName();
        log.info("目标对象的类名:{}",name);
        //2.获取目标对象的方法名
        String name1 = joinPoint.getSignature().getName();
        log.info("获得目标方法的方法名:{}",name1);
        //3.获取目标方法运行时传入的参数
        Object[] args = joinPoint.getArgs();
        log.info("目标方法运行时传入的参数:{}", Arrays.toString(args));
        //4.放行,目标方法执行
        Object proceed = joinPoint.proceed();
        //5.获取 目标方法运行时的返回值
        log.info("目标方法运行的返回值:{}",proceed);
        return proceed;
    }
}

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

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

相关文章

CSS - 你实现过0.5px的线吗

难度级别:中级及以上 提问概率:75% 我们知道在网页显示或是网页打印中,像素已经是最小单位了,但在很多时候,即便是最小的1像素,精度却不足以呈现所需的线条精度和细节。因此,为了在网页显示和网页打印中呈现更加细致的线条,为了在视觉…

【计算机网络】epoll

IO多路转接 - epoll 一、I/O多路转接之 epoll1. epoll 接口&#xff08;1&#xff09;epoll_create()&#xff08;2&#xff09;epoll_wait()&#xff08;3&#xff09;epoll_ctl() 2. epoll 原理3. epoll 的优点4. epoll 的使用5. epoll 的工作模式&#xff08;1&#xff09;水…

中高级前端? 这些一元运算符,你真的搞清楚了吗

前言 一元运算符&#xff0c;不太起眼&#xff0c;作用很大&#xff0c;请别忽视她&#xff01; 走近她&#xff0c;爱上她&#xff01; 定义 只需要一个操作数的运算符称为一元运算符。 还是代码容易懂&#xff1a; 1 // 一个操作数1 2 // 两个操作数一元运算符清单 运…

MacOS - brew 和 brew cask 有什么区别?

brew 是 ruby 的包管理&#xff0c;后来看 yangzhiping 的博客介绍了 brew cask&#xff0c;感觉 cask 是更好的关联关系管理&#xff0c;但是&#xff0c;我后来使用过程中&#xff0c;发现很多软件 brew cask 里没有&#xff0c;但是 brew 里面倒是挺多&#xff01;今天来给说…

一键批量高效记账,支持通过关键词来筛选某个人的借款记录,方便高效管理收支明细

随着生活节奏的加快&#xff0c;个人和企业财务管理变得越来越复杂。尤其是在处理大量记账任务时&#xff0c;如何快速、准确地完成&#xff0c;并且能够方便地追踪和筛选特定借款记录&#xff0c;成为了许多人关注的焦点。现在&#xff0c;我们为您提供一款全新的财务管理工具…

小程序appsecret在哪里看

问题开发中需要用到appid和secret。但找不到secret。后面发现是在微信开发者平台自己生成才行 微信公众平台 (qq.com) 在开发者平台的开发管理当中&#xff0c;生产即可

U盘位置不可用?数据恢复有高招!

在我们日常生活和工作中&#xff0c;U盘已经成为不可或缺的数据存储工具。然而&#xff0c;有时我们会遭遇一个令人头疼的问题&#xff1a;将U盘插入电脑后&#xff0c;系统提示“U盘位置不可用”。这究竟意味着什么呢&#xff1f;简单来说&#xff0c;这就是电脑无法识别或访问…

mysql慢sql排查与分析

当MySQL遇到慢查询&#xff08;慢SQL&#xff09;时&#xff0c;我们可以通过以下步骤进行排查和优化&#xff1a; 标题开启慢查询日志&#xff1a; 确保MySQL的慢查询日志已经开启。通过查看slow_query_log和slow_query_log_file变量来确认。 如果没有开启&#xff0c;可以…

新项目视频号小店挣钱吗?可全职可副业可量化,新蓝海项目来了!

大家好&#xff0c;我是电商花花。 一个有潜力的新项目&#xff0c;自然会吸引到很多创业者的追捧&#xff0c;尤其是&#xff0c;目前最火的视频号小店无货源项目&#xff0c;可以说是继抖音小店无货源电商之外又一匹黑马。 今年想创业的人不妨看一看&#xff0c;视频号小店值…

chatGPT4无法登录

遇到问题&#xff1a;chatgpt网站上点击登录&#xff08;log in),网站就会跳转并显示&#xff1a;unable to connect 解决方法&#xff1a;不要用亚洲节点&#xff0c;亚洲节点被全面封禁&#xff0c;在全局代理中可以换成美国的节点

约数与倍数-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第45讲。 约数与倍数&#…

基于SpringBoot Vue学生信息管理

一、&#x1f4dd;功能介绍 基于SpringBoot Vue学生信息管理 角色&#xff1a;管理员、学生、教师 管理员&#xff1a;管理员进入主页面&#xff0c;主要功能包括对系统首页、个人中心、学生管理、教师管理、公告通知管理、课程类型管理、课程信息管理、选课信息管理、课程成…

Java 关键字 this 使用详解(通俗易懂)

this关键字主要有以下三个地方使用 在方法体中引用当前对象&#xff0c;即其方法被调用的对象&#xff0c;以便将当前对象的实例变量或当前对象作为参数传递给其他方法。 ① t this.x; 要在方法中引用当前对象&#xff0c;可以使用关键字 this。 ② return this; 作为当前…

Spring注解开发和XML开发

目录 Spring简介发展史Spring Framework系统架构spring 核心概念IOC、IOC容器、Bean、DIIOC快速入门DI快速入门 IOCBean基础配置id与class属性name属性scope属性 Bean的实例化构造方法静态工厂实例工厂FactoryBean的使用&#xff08;工厂实例的简化&#xff09; Bean的生命周期…

160 Linux C++ 通讯架构实战14,epoll 反应堆模型

到这里&#xff0c;我们需要整理一下之前学习的epoll模型&#xff0c;并根据之前的epoll模型&#xff0c;提出弊端&#xff0c;进而整理epoll反应堆模型&#xff0c;进一步深刻理解&#xff0c;这是因为epoll实在是太重要了。 复习之前的epoll的整体流程以及思路。 参考之前写…

DHCP工作过程以及抓包分析

从PC1的e0/0/1接口进行抓包 客户端基于UDP、源端口68、目标端口67进行广播请求&#xff0c;源IP0.0.0.0&#xff0c;&#xff08;无效地址&#xff0c;代表本地无地址&#xff09;目标IP255.255.255.255&#xff1b; 从下面截图可以看出&#xff1a; 源mac为电脑mac&#xff…

采用C#.net6.0+Vue,Ant-Design技术开发的一套大型医院手术麻醉信息系统源码,系统成熟,运行稳定

手术麻醉信息系统源码&#xff0c;C#手麻系统源码&#xff0c;自主版权应用案例&#xff08;适合上项目&#xff09; 手术麻醉信息系统可以实现手术室监护仪、麻醉机、呼吸机、输液泵等设备输出数据的自动采集&#xff0c;采集的数据能据如实准确地反映患者生命体征参数的变化&…

【Leetcode笔记】102.二叉树的层序遍历

目录 知识点Leetcode代码&#xff1a;ACM模式代码&#xff1a; 知识点 vector、queue容器的操作 对vector<int> vec;做插入元素操作&#xff1a;vec.push_back(x)。对queue<TreeNode*> que;做插入元素操作&#xff1a;que.push(root);。队列有四个常用的操作&…

Redis从入门到精通(六)Redis实战(三)优惠券秒杀

↑↑↑下载测试项目原代码↑↑↑ 文章目录 前言4.3 优惠券秒杀4.3.1 数据表与实体类4.3.2 添加优惠券4.3.2.1 添加普通券代码4.3.2.2 添加秒杀券代码 4.3.3 实现秒杀下单4.3.3.1 秒杀下单逻辑分析4.3.3.2 获取秒杀订单ID4.3.3.3 获取用户ID4.3.3.4 实现秒杀下单 前言 Redis实战…

团体程序设计天梯赛-练习集 01

天梯赛题解合集 团体程序设计天梯赛-练习集 (L1-001 - L1-012) 团体程序设计天梯赛-练习集 (L1-013 - L1-024) 团体程序设计天梯赛-练习集 (L1-025 - L1-036) 团体程序设计天梯赛-练习集 (L1-037 - L1-048) L1-001 Hello World 输出题 样例 输入 输出 Hello World!思…