AOP&事务

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: AOP&事务

切入点:要进行增强的方法

切入点表达式:要进行增强的方法的描述方式

描述方式一:执行com.itheima.dao包下的BookDao接口中的无参数update方法

execution(void com.itheima.dao.BookDao.update())

描述方式二:执行com.itheima.dao.impl包下的BookDaoImpl类中的无参数update

切入点表达式标准格式:动作关键字(访问修饰符 返回值 包名.类/接口名.方法名(参数)异常名)

动作关键字:描述切入点的行为动作,流execution表示执行到指定切入点

可以使用通配符描述切入点,快速描述

*:单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现

*就是一个任意符号

execution (public * com.itheima..UserService.find (*))

匹配com.itheima包下的任意包中的UserService类或接口中所有find开头的带有一个参数的方法

..:多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写

..就是一个或多个参数或没有都行

书写技巧

所有代码按照标准规范开发,否则以下技巧全部失效

描述切入点通常描述接口,而不描述实现类

访问控制修饰符针对接口开发均采用public描述(可省略访问控制修饰符描述)

返回值类型对于增删改类使用精准类型加速匹配,对于查询类使用*通配快速描述

包名书写尽量不使用..匹配,效率过低,常用*做单个包描述匹配,或精准匹配

接口名/类名书写名称与模块相关的采用*匹配,例如UserService书写成*Service,绑定业务层接口名

方法名书写以动词进行精准匹配,名词采用*匹配,例如getById书写成getBy*,selectAll书写成selectAll

参数规则较为复杂,根据业务方法灵活调整

通常不使用异常作为匹配规则

AOP通知类型

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

AOP通知共分为5种类型

前置通知

@Before就是前置,在程序前面执行

后置通知

环绕通知(重点)

@Around

返回后通知(了解)

抛出异常后通知(了解)

@Around注意事项

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

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

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

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

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

案例:测量业务层接口万次执行效率

需求:任意业务层接口执行均可显示其执行效率(执行时长)

分析:

1.业务功能:业务层接口执行前后分别记录时间,求差值得到执行效率

2.通知类型选择前后均可以增强的类型——环绕通知

需求:任意业务层接口执行均可显示其执行效率(执行时长)

分析:

1.业务功能:业务层接口执行前后分别记录时间,求差值得到执行效率

2.通知类型选择前后均可以增强的类型——环绕通知

当前测试的接口执行效率仅仅是一个理论值,并不是一次完整的执行过程

AOP通知获取数据

获取切入点方法的参数

JoinPoint:适用于前置、后置、返回后、抛出异常后通知

ProceedJointPoint:适用于环绕通知

获取切入点方法返回值

返回后通知

环绕通知

获取切入点方法运行异常信息

抛出异常后通知

环绕通知

把数据通过数组的方式拿出来

AOP总结

概念:AOP面向切面编程,一种编程范式

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

核心概念

代理:SpringAOP的核心本质是采用代理模式实现的

连接点:在SpringAOP中理解为任意方法的执行

切入点:匹配连接点的式子,也是具有共性功能的方法描述

通知:若干个方法的共性功能,在切入点处执行,最终体现为一个方法

切面:描述通知与切入点的对应关系

目标对象:被代理的原始对象成为目标对象

通知类型

前置通知

后置通知

环绕通知(重点)

环绕通知依赖形参 才能实现对原始方法的调用

环绕通知可以隔离原始方法的调用执行

环绕通知返回值设置为Object类型

环绕通知中可以对原始方法调用过程中出现的异常进行处理

返回后通知

抛出异常后通知

获取切入点方法的参数

JoinPoint:适用于前置、后置、返回后、抛出异常后通知,设置为方法的第一个形参

ProceedJointPoint:适用于环绕通知

获取切入点方法返回

返回后通知

环绕通知

获取切入点方法运行异常信息

抛出异常后通知

环绕通知

Spring事务简介

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

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

模拟银行账户间转账业务

需求:实现任意两个账户间转账操作

需求微缩:A账户减钱,B账户加钱

分析:

1.数据层提供基础操作,指定账户减钱,指定账户加钱

2.业务层提供转账操作,调用减钱与加钱的操作

3.提供2个账号和操作金额执行转账操作

4.基于Spring整合MyBatis环境搭建上述操作

结果分析:

1.程序正常执行时,账户金额A减B加,没有问题

2.程序出现异常后,转账失败,但是异常之前操作成功,异常之后操作失败,整体业务失败

开启事务,写到接口的方法上

AOP总结

概念:AOP面向切面编程,一种编程范式

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

核心概念

代理:SpringAOP的核心本质是采用代理模式实现的

连接点:在SpringAOP中理解为任意方法的执行

切入点:匹配连接点的式子,也是具有共性功能的方法描述

通知:若干个方法的共性功能,在切入点处执行,最终体现为一个方法

切面:描述通知与切入点的对应关系

目标对象:被代理的原始对象成为目标对象

通知类型

前置通知

后置通知

环绕通知(重点)

环绕通知依赖形参 才能实现对原始方法的调用

环绕通知可以隔离原始方法的调用执行

环绕通知返回值设置为Object类型

环绕通知中可以对原始方法调用过程中出现的异常进行处理

返回后通知

抛出异常后通知

获取切入点方法的参数

JoinPoint:适用于前置、后置、返回后、抛出异常后通知,设置为方法的第一个形参

ProceedJointPoint:适用于环绕通知

获取切入点方法返回

返回后通知

环绕通知

获取切入点方法运行异常信息

抛出异常后通知

环绕通知

Spring事务简介

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

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

模拟银行账户间转账业务

需求:实现任意两个账户间转账操作

需求微缩:A账户减钱,B账户加钱

分析:

1.数据层提供基础操作,指定账户减钱,指定账户加钱

2.业务层提供转账操作,调用减钱与加钱的操作

3.提供2个账号和操作金额执行转账操作

4.基于Spring整合MyBatis环境搭建上述操作

结果分析:

1.程序正常执行时,账户金额A减B加,没有问题

2.程序出现异常后,转账失败,但是异常之前操作成功,异常之后操作失败,整体业务失败

开启事务,写到接口的方法上

注意事项:事务管理器要根据实现技术进行选择

MyBatis框架使用的是JDBC事务

Spring 事务角色

事务角色

事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法

事务协调员:加入事务,在Spring中通常指代数据层方法,也可以是业务层方法

事务相关配置

readOnly 设置是否为只读事务 ,readOnly =true 只读事务

Timeout 设置事务超时时间 Timeout =-1 永不超时

rollbackFor 设置事务回滚异常

设置回滚条件:遇到这种异常就回滚

需求:实现任意两个账户间转账操作,并对每次转账操作在数据库进行留痕

需求微缩:A账户减钱,B账户加钱,数据库记录日志

分析:

1.基于转账操作案例添加日志模块,实现数据库中记录日志

2.业务层转账操作,调用减钱、加钱与记录日志功能

实现效果预期:

无论转账是否成功,均进行转账操作的日志留痕

存在的问题:

日志的记录与转账操作隶属同一个事务,同成功同失败

实现效果预期改进:

无论转账操作是否成功,日志必须保留

事务传播行为:事务协调员对事务管理员所携带事务的处理态度

不再受事务管理员的影响

new一个新事务


相关实践学习
日志服务之数据清洗与入湖
本教程介绍如何使用日志服务接入NGINX模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
目录
相关文章
|
9月前
|
XML Java 数据格式
13Spring - Spring转账Demo(了解事务及AOP)
13Spring - Spring转账Demo(了解事务及AOP)
30 0
|
2月前
|
XML Java 数据库连接
【Spring】JDBC、AOP、事务
【Spring】JDBC、AOP、事务
|
2月前
|
Java Spring
使用spring的aop实现全局的事务控制
使用spring的aop实现全局的事务控制
56 0
|
7月前
|
XML Java 编译器
Spring的AOP和事务
Spring的AOP和事务
33 0
|
12月前
|
存储 SpringCloudAlibaba Java
Spring基于AOP事务控制实现原理
对于一个系统应用而言,使用数据库进行数据存储是必然的,意味着开发过程中事务的使用及控制也是必不可少的,当然事务是数据库层面的知识点并不是`Spring`框架所提出的。使用JDBC开发时,我们使用`connnection`对事务进行控制,使用`MyBatis`时,我们使用`SqlSession`对事务进行控制,缺点显而易见,当我们切换数据库访问技术时,事务控制的方式总会变化,所以`Spring` 就在这些技术基础上,提供了统一的控制事务的接口。Spring的事务分为:编程式事务控制和声明式事务控制
31307 10
Spring基于AOP事务控制实现原理
|
11月前
|
XML Java 数据库连接
2021-08-10基于注解配置AOP,银行取款初步后台搭建,spring事务处理,注解方式事务配置,spring+mybatis整合
2021-08-10基于注解配置AOP,银行取款初步后台搭建,spring事务处理,注解方式事务配置,spring+mybatis整合
346 1
|
JSON 算法 安全
JavaWeb基础知识-登录效验-spring事务-AOP(二)
2.JWT令牌 全称:JSON Web Token (https:/ljwt.io/) 定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。 组成: 第一部分:Header(头),记录令牌类型、签名算法等。例如: {“alg”:“HS256” ,“type” :“JWT”} 第二部分: Payload(有效载荷),携带一些自定义信息、默认信息等。例如:{“id”.“1” ,“username”:“Tom”} 第三部分: Signature(签名),防止Token被篡改、确保安全性。将header、 payload,并加入指定秘钥
|
监控 Java Spring
Spring JDBC-实施Spring AOP事务注意事项及案例分析
Spring JDBC-实施Spring AOP事务注意事项及案例分析
119 0
|
Java 数据库 Spring
【Spring的事务与AOP实现原理】
【Spring的事务与AOP实现原理】
270 0
【Spring的事务与AOP实现原理】
|
XML Oracle 前端开发
理论:第二章:Spring的AOP和IOC是什么?使用场景有哪些?Spring事务与数据库事务,传播行为,数据库隔离级别
理论:第二章:Spring的AOP和IOC是什么?使用场景有哪些?Spring事务与数据库事务,传播行为,数据库隔离级别
113 0