13.1 事务管理
13.1.1 事务回顾
13.1.2 Spring事务管理
在删除员工前放置异常,这样sql里3号部门被删除,但3号部门的员工却未被删除。
13.1.3 事务进阶
未进行正常回滚
13.1.3.1 rollbackfor
13.1.3.2 propagation
只需要关注前两个就好
加一个
REQUIRES_NEW
设置为REQUEST_NEW代表需要一个新的事务,无论当前是否有事务,都会创建一个新的事务,无论delete是否有异常,都不影响被调用的insert事务的正常提交
13.2 AOP基础
13.2.1 AOP概述
@Aspect:声明当前类为AOP类
@Around:针对特定方法进行编程。
com.itheima.service:包名
第一个*:类或接口
第二个*:方法名。
com.itheima.service.*.*:对包里所有的类或接口编程
画横线的地方表示拿到方法的签名
没修改任何原始业务方法,就已经往里添加了统计耗时功能
13.3 AOP核心概念
切入点PointCut是个注解,后面加匹配连接点的条件(execution:切入点表达式)
AOP执行流程
左上角是我们要定义的AOP类,里面确定了我们需要增强的类
右上角为AOP要增强的目标对象的类
右下角为增强后的代理对象类
左下角程序片段里的private DeptService deptService实际上新建的是右下角代理对象,调用的list方法实际上是调用的代理对象的list方法。
右下角代理程序里实际上测量的是deptMapper.list()执行的时间
13.4 AOP进阶
13.4.1 通知类型
切面类就是AOP类
13.4.2 通知顺序
切面类(就是AOP包里的类)的执行顺序。
一般用第二种,@Order控制切面类里通知方法的执行顺序
13.4.3 切入点表达式
例:
基于类描述
为DeptServiceImpl类里的delete加前置通知
编写切面类
@Slf4j:提供日志保存功能
@Component:把该类交给ioc容器管理
@Autowired//为下面的DeptService 接口提供bean对象
private DeptService deptService
点击绿色按钮,运行该单元测试
基于接口描述
依然可以匹配到DeptServiceImpl类里的delete方法
第一个*代表返回值类型
com
*:二级包任意
service.DeptService里所有的方法
该切入点表达式的意思是
com.service包下,以delete开头的方法,(*)表示该方法只有一个参数
该切入点表达式里(..)意思是匹配任意数量参数的方法。
第一个:匹配com下所有的包里的所有方法
第二个:匹配当前环境下下所有的方法(慎用)
@Target表明生效的地方
在想要添加通知的扩展名上面添加@Mylog即可
13.4.4 连接点
13.5 AOP案例
记录方法执行时长,使用环绕通知@Around
建表语句
粘贴进查询控制台运行
把准备好的实体类OpeatorLog粘贴在pojo里
把mapper接口粘贴到mapper包下
自定义注解@Log
@Rentention(RententionPolicy.RUNTIME):定义该注解什么时候有效
@Target(ElementType.Runtime):定义作用范围(类或者方法上)METHOD
@Autowired:拿到这次请求的request对象
30行:拿到令牌
31行:解析令牌中的数据
Claims:map类型数据
getSignature():表示获取方法的签名
getName():表示获取签名的名字
把获取到的数据封装到实体类OperateLog的对象operateLog里
第一个参数id主键自增,不需要赋值
给方法加上@Log就会被球面类的切入点表达式匹配到