黑马2023Javaweb(13)|事务管理,AOP(面向切面编程)

49a3275816764ea8a0d436522bd26dcc.png

一:事物管理

05727c491473428d9688bd0ac5fa9a0d.png

1.事务回顾

一组操作的集合,要么同时成功,要么同时失败。任何一个操作失败时,之前已执行的操作会回滚(恢复操作前)

7804e76ce68a45e798773d502747f0b6.png

2.Spring事务管理

2.1 案例:解散部门(删除部门,同时删除该部门下的员工)

(1)删除该部门下的员工

45e62003498a4c15ace7ff1bddd2c8dd.png

(2)完善删除部门操作

0bff82723ef540bb9026b5f799b7184b.png

(3)问题异常示例

9c2b4762cf994f4d960e58a952d7e20f.png

通过@Transactional注解可以完成对事务的控制,从而将删除部门和删除部门下员工这两个操作划分到一个事务中来,即要么同时成功,要么同时失败。

2.2Transactional注解(事务管理)

(加此注解:将此方法/类交给 Spring事务管理)

(1)概述

一般在增删改方法上,且方法涉及多步操作,加此注解,另其处于同一事务下。多步操作只要有一步增删改失败,其余所有步骤都不执行,对于已经执行的步骤,恢复其增删改数据。

思考:查询方法不需要事务管理--因为查询不涉及对数据的改变

在方法上:对方法的事务管理

在接口:对所有接口的实现类都同属于一个事务

1f5406dc2feb4f5293ecd71db40da450.png

删除部门与部门下的员工操作,直接在方法上加

e76eba7f4af9473e82d35f134eed875e.png

(2)开启事务管理日志开关(application.yml)

配置文件:application.yml

b58dc5d2fb6843cbaa12a546105b4e62.png

3.事务进阶(@Transactional注解的两个属性)

@Transactional注解的细节问题(详解)

3.1rollbackFor

默认情况下,只有出现运行时异常,才会回滚异常,如果不是,则不会回滚,那么我们可以通过rollbackFor来指定控制的异常类型,从而实现非运行时异常的回滚。

d7049d0a082b47e09b3aa1f7b8945708.png

3.2propagation(传播行为)

2627b47e8ea14a129465f39703bef95a.png

7cdf6355411d488796f877d8eb7d43a2.png

3.3 案例

(1)required  与  required_new的区别

propagation属性值:required  与  required_new的区别

required:a事务出错,b事务会回滚---a,b是同一个事物

required_new:a事务出错,b事务不会回滚

(2)IDEA控制台日志过滤插件:

日志的过滤筛选

408e3cb1a7a94c258165f6e081b52411.png

6c1f4fb5b8df4410ba6d635ab5501bf0.png

3.4小结

60750a5cddd241c4b968a5ab02b1b275.png

二:AOP基础

1.AOP概述

AOP:面向方法编程

在不改变原来方法的基础上,扩展原来方法---构建模板方法--动态代理

如下:不改变这些实现的方法,进行统计方法的运行时间

95d5e08625eb46ee9a9030df3316c161.png

构建模板方法--动态代理

(通过动态代理技术,对特定的方法进行编程(不改变方法的前提下,对其进行扩展)

(可以把整个方法看作一个固定的部分f函数,对这个f函数求新的g(f)功能))

76059d525cac465c8194e8ab01375a07.png

2.AOP快速入门

2.1 案例:统计各个方法的执行耗时

(1)分析

step1:pom.xml文件中导入AOP依赖

step2:编写AOP程序

新建一个类--类交与IOC容器管理(类前加注解:@Component

指明该类是一个AOP类(加注解@Asepct

指明该AOP类的操作范围(可以操作那些方法):@Around注解,前面是域名,后面两个点表明所有包下所有类下的所有方法

ad40dba66c5a4e8fbe9e7c695cdf6c0d.png

(2)代码实现

a.导入依赖:

9603490e7fcf40a990caafc3c0e91ddf.png

b.编写程序

4cabbbc066764f1f89a81a8759ff96a1.png

596b59a85a324af9b99cd1c8ed29a572.png

问题:该方法是有返回值的,但不是时间(运行时间通过日志输出),返回值是原始方法的运行结果Object类

c.切入点表达式

091a2911e9854fa580d553186d24c94e.png

2.2 业务场景

(1)场景

AOP通过动态代理对特定的方法编程

事务管理底层逻辑也是AOP

05908f06953444c787a98c540acc1cd7.png

(2)优势

87f5f2fedabf43db92e3bca80034611e.png

3.AOP核心概念

3.1 核心概念

连接点:被控制的方法(类似将整个方法作为一个变量,求该变量的函数)

切入点:仅操作图中DeptServise类里的list方法(该AOP类实际操作的方法)

切面:通知+切入点

92e949a0bf1c4ac18919562f6e3c4111.png

3.2AOP执行流程

Spring的AOP底层是基于动态代理技术来实现的,也就是说在程序运行的时候,会自动的基于动态代理技术为目标对象生成一个对应的代理对象。在代理对象当中就会对目标对象当中的原始方法进行功能的增强

(理解为生成了一个副本,副本对原来进行了增强(记录方法执行时间),且在程序运行中,其他地方再调用该方法时,用的是副本(代理对象),在代理对象中调用目标对象的方法)

f59c7b68f92b47998acdf43adaf74e86.png

(1)注入的代理对象

@Autowired注入的代理对象,非目标对象

代理对象的生成和注入都是自动的。在代理对象中扩展方法,而不改变其原始方法

b3fec848c62f4f49a2c7587c802d5ccf.png

(2)在代理对象中调用目标对象里的原方法

0f67c023f7a24179a22eabedb6e84477.png

3.3 小结

ab733222dfd44f28969e915f043b0fa0.png

三:AOP进阶

56babb820f5445d3a17edf29bf33ac89.png

1.通知类型

9f228ce080114742b644d3354195282c.png

1.1 5种通知类型详解

(1)定义切面类

e7989b6f3ed84b998830b767eb0e385a.png

(2) @Before

27b034528b3b4dc5bc6997686868005c.png

(3) @Around

通知方法在目标方法执行前后都运行

方法是带参(连接点joipoint),有返回值的

原始方法有异常时,通知方法的后部分不执行,只有前面被执行

6136ff67d4ff4b9789f3447ac5432435.png

(4)@After

1cfec099a4f84e03b7a1922fd24f4d95.png

(5) @AfterReturning 

返回后通知,此注解标注的通知方法在目标方法后被执行

有异常通知方法不执行

56453034fcaf4de8b5b516cfff77f6f9.png

(6) @AfterThrowing 

异常后通知,此注解标注的通知方法发生异常后执行

有异常,通知方法才执行

ff2c7ca5b1424f1b8ba0ec9f6c5e2859.png

1.2 注意事项

d10490e6ea534507b72b289deea62054.png

1.3 @PointCut注解:抽取公共切点表达式

c44e5b1179234629bff1239d59c36510.png

如果切入点表达式需要改动,那么只需要改动最上面的就可以了

a51bf649cea44826a02313e1b975e57e.png

注意事项:

将其设为public,pt()表达式也可以在其他AOP类里使用

748d08487a6746fc84e846561c8ac75f.png

1.4小结

b94adfc8fac942f6a4d2556f16c8057c.png

2.通知顺序

5f87fc5135564bbdabfe1eec118222fd.png

2.1类名字母排序

7ad82d96c6e242feab0eb997cbad05db.png

27e6fa8742d84a4389b7e188d7b40286.png

8d7264c42f7e4271b798a4ba025a8648.png

@Order注解

0c6d07a0c0e34c17a79803ea58dab10a.png

3.切入点表达式

6f9f28ff8525444886dd2fc5143f0158.png

3.1 execution ()

d148d82a671f4d27ad2d43a6faa0e4c8.png

(1) *  与  ..  的使用

*:单个任意符号

..:任意个任意符号

f3647a0433c9481da6d083045512b546.png

e61d3276e2294b97a44feb41ad4bd2bc.png

*所有以Service为结尾的类名中以delete为首的所有方法

454ad58642e04fdba09319b9e3b89513.png

..任意包名/类名/方法名/任意参数

838c8b8e86e7490cbaa67c07db50807b.png

(2)注意事项

4eff1fcb15944346bd0dde853297f73f.png

|| :匹配上这两个中的一个,该通知方法就会执行

172cd1616c9344c4a4afaaa154ee3f07.png

(3)书写建议

94bff07b128c4018874a470d86d59ded.png

3.2 @annotation

图中是 匹配 有log 注解的方法(log是一个注解类)

1b0fd92584cd44389b5f0f9d213d37bb.png

(1)创建注解类mylog(注解名随意)

455db0dd1e904ade9be4c755af5fde4c.png

(2)给需要切入的方法加上注解mylog

30bb6c3ad509447798d339ab5d5a6c36.png

(3)在通知方法中通过@annotation匹配特定标识(mylog)注解的方法

67c4eb7e2f184fc7ada931b0f994efe6.png

3.3 小结

注解类是自定义的

2ecbcaf400894e968ccfec238524a450.png

4.连接点

d67ad12ab0fc473481c32d64399783da.png

1771dde48aff4794af0a19969f7cabb9.png

示例:@Around通知

1f814f61a0e6427faa62bbe6f3ebf59c.png

5.AOP案例

5.1 案例需求--操作日志

e9ff6f4b509b4eb68ceef08a318807e2.png

5.2 思路分析

43d9ed92c79a4b978fb5899809fc5ac7.png

5.3 步骤

69c84142ec234640a0e7d62bb5f5599c.png

【Java Web】013 -- SpringBootWeb综合案例(事务管理、AOP)_web项目 自定义开启事务-CSDN博客

(1)引入AOP依赖

(2)(重)导入数据库表(日志数据表),引入对应实体类

1357443b88154c69b3a0b2ea0d0d5f28.png

db9b2804471641be9a3a173ca9543c60.png

(3)(重)引入mapper接口

39a507a992884a95a5a229c64aad4e32.png(4)自定义Log注解,仅起到标识方法的作用,不需要指定属性:

a11db5b1edb94cc18da4e3ab6e4f5303.png

(5)定义一个切面类:

851518b32ded46748c563015b6d250f5.png

f753d4e4a7d248bd9df1a68cbfd6ee47.png

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值