切入点:要进行增强的方法
切入点表达式:要进行增强的方法的描述方式
描述方式一:执行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一个新事务