一:事物管理
1.事务回顾
一组操作的集合,要么同时成功,要么同时失败。任何一个操作失败时,之前已执行的操作会回滚(恢复操作前)
2.Spring事务管理
2.1 案例:解散部门(删除部门,同时删除该部门下的员工)
(1)删除该部门下的员工
(2)完善删除部门操作
(3)问题异常示例
通过@Transactional注解可以完成对事务的控制,从而将删除部门和删除部门下员工这两个操作划分到一个事务中来,即要么同时成功,要么同时失败。
2.2Transactional注解(事务管理)
(加此注解:将此方法/类交给 Spring事务管理)
(1)概述
一般在增删改方法上,且方法涉及多步操作,加此注解,另其处于同一事务下。多步操作只要有一步增删改失败,其余所有步骤都不执行,对于已经执行的步骤,恢复其增删改数据。
思考:查询方法不需要事务管理--因为查询不涉及对数据的改变
在方法上:对方法的事务管理
在接口:对所有接口的实现类都同属于一个事务
删除部门与部门下的员工操作,直接在方法上加
(2)开启事务管理日志开关(application.yml)
配置文件:application.yml
3.事务进阶(@Transactional注解的两个属性)
@Transactional注解的细节问题(详解)
3.1rollbackFor
默认情况下,只有出现运行时异常,才会回滚异常,如果不是,则不会回滚,那么我们可以通过rollbackFor来指定控制的异常类型,从而实现非运行时异常的回滚。
3.2propagation(传播行为)
3.3 案例
(1)required 与 required_new的区别
propagation属性值:required 与 required_new的区别
required:a事务出错,b事务会回滚---a,b是同一个事物
required_new:a事务出错,b事务不会回滚
(2)IDEA控制台日志过滤插件:
日志的过滤筛选
3.4小结
二:AOP基础
1.AOP概述
AOP:面向方法编程
在不改变原来方法的基础上,扩展原来方法---构建模板方法--动态代理
如下:不改变这些实现的方法,进行统计方法的运行时间
构建模板方法--动态代理
(通过动态代理技术,对特定的方法进行编程(不改变方法的前提下,对其进行扩展)
(可以把整个方法看作一个固定的部分f函数,对这个f函数求新的g(f)功能))
2.AOP快速入门
2.1 案例:统计各个方法的执行耗时
(1)分析
step1:pom.xml文件中导入AOP依赖
step2:编写AOP程序
新建一个类--类交与IOC容器管理(类前加注解:@Component)
指明该类是一个AOP类(加注解@Asepct)
指明该AOP类的操作范围(可以操作那些方法):@Around注解,前面是域名,后面两个点表明所有包下所有类下的所有方法
(2)代码实现
a.导入依赖:
b.编写程序
问题:该方法是有返回值的,但不是时间(运行时间通过日志输出),返回值是原始方法的运行结果Object类
c.切入点表达式
2.2 业务场景
(1)场景
AOP通过动态代理对特定的方法编程
事务管理底层逻辑也是AOP
(2)优势
3.AOP核心概念
3.1 核心概念
连接点:被控制的方法(类似将整个方法作为一个变量,求该变量的函数)
切入点:仅操作图中DeptServise类里的list方法(该AOP类实际操作的方法)
切面:通知+切入点
3.2AOP执行流程
Spring的AOP底层是基于动态代理技术来实现的,也就是说在程序运行的时候,会自动的基于动态代理技术为目标对象生成一个对应的代理对象。在代理对象当中就会对目标对象当中的原始方法进行功能的增强。
(理解为生成了一个副本,副本对原来进行了增强(记录方法执行时间),且在程序运行中,其他地方再调用该方法时,用的是副本(代理对象),在代理对象中调用目标对象的方法)
(1)注入的代理对象
@Autowired注入的代理对象,非目标对象
代理对象的生成和注入都是自动的。在代理对象中扩展方法,而不改变其原始方法
(2)在代理对象中调用目标对象里的原方法
3.3 小结
三:AOP进阶
1.通知类型
1.1 5种通知类型详解
(1)定义切面类
(2) @Before
(3) @Around
通知方法在目标方法执行前后都运行
方法是带参(连接点joipoint),有返回值的
原始方法有异常时,通知方法的后部分不执行,只有前面被执行
(4)@After
(5) @AfterReturning
返回后通知,此注解标注的通知方法在目标方法后被执行
有异常通知方法不执行
(6) @AfterThrowing
异常后通知,此注解标注的通知方法发生异常后执行
有异常,通知方法才执行
1.2 注意事项
1.3 @PointCut注解:抽取公共切点表达式
如果切入点表达式需要改动,那么只需要改动最上面的就可以了
注意事项:
将其设为public,pt()表达式也可以在其他AOP类里使用
1.4小结
2.通知顺序
2.1类名字母排序
@Order注解
3.切入点表达式
3.1 execution ()
(1) * 与 .. 的使用
*:单个任意符号
..:任意个任意符号
*所有以Service为结尾的类名中以delete为首的所有方法
..任意包名/类名/方法名/任意参数
(2)注意事项
|| :匹配上这两个中的一个,该通知方法就会执行
(3)书写建议
3.2 @annotation
图中是 匹配 有log 注解的方法(log是一个注解类)
(1)创建注解类mylog(注解名随意)
(2)给需要切入的方法加上注解mylog
(3)在通知方法中通过@annotation匹配特定标识(mylog)注解的方法
3.3 小结
注解类是自定义的
4.连接点
示例:@Around通知
5.AOP案例
5.1 案例需求--操作日志
5.2 思路分析
5.3 步骤
【Java Web】013 -- SpringBootWeb综合案例(事务管理、AOP)_web项目 自定义开启事务-CSDN博客
(1)引入AOP依赖
(2)(重)导入数据库表(日志数据表),引入对应实体类
(3)(重)引入mapper接口
(4)自定义Log注解,仅起到标识方法的作用,不需要指定属性:
(5)定义一个切面类: