SpringBootWeb事務管理 & AOP

目錄
事務管理
AOP基礎
AOP進階
AOP案例

一、事務管理
1.事務回顧
概念:事務是一組操作的集合,它是一個不可分割的工作單位,這些操作 要么同時成功,要么同時失敗。
操作:
開啟事務(一組操作開始前,開啟事務):start transaction / begin ;
提交事務(這組操作全部成功后,提交事務):commit ;
回滾事務(中間任何一個操作出現(xiàn)異常,回滾事務):rollback ;

2.Spring事務管理

問題:即使程序運行拋出了異常,部門依然刪除了,但是部門下的員工卻沒有刪除,造成了數(shù)據(jù)的不一致。這樣我們用到了@Transactional注解。
注解:@Transactional
位置:業(yè)務(service)層的方法上、類上、接口上
作用:將當前方法交給spring進行事務管理,方法執(zhí)行前,開啟事務;成功執(zhí)行完畢,提交事務;出現(xiàn)異常,回滾事務

3.事務進階
事務屬性-回滾
rollbackFor
默認情況下,只有出現(xiàn) RuntimeException 才回滾異常。rollbackFor屬性用于控制出現(xiàn)何種異常類型,回滾事務。

事務屬性-傳播行為
propagation
事務傳播行為:指的就是當一個事務方法被另一個事務方法調用時,這個事務方法應該如何進行事務控制。


只需要關注REQUIRED和REQUIRES_NEW就可以了。
REQUIRED :大部分情況下都是用該傳播行為即可。
REQUIRES_NEW :當我們不希望事務之間相互影響時,可以使用該傳播行為。比如:下訂單前需要記錄日志,不論訂單保存成功與否,都需要保證日志記錄能夠記錄成功。

小結:
1.事務
2.Spring事務管理
@Transactional
3.事務屬性
rollbackFor
propagation

二.AOP基礎
1.AOP概述
AOP:Aspect Oriented Programming(面向切面編程、面向方面編程),其實就是面向特定方法編程。
場景:案例部分功能運行較慢,定位執(zhí)行耗時較長的業(yè)務方法,此時需要統(tǒng)計每一個業(yè)務方法的執(zhí)行耗時


實現(xiàn):動態(tài)代理是面向切面編程最主流的實現(xiàn)。而SpringAOP是Spring框架的高級技術,旨在管理bean對象的過程中,主要通過底層的動態(tài)代理機制,對特定的方法進行編程。

2.AOP快速入門
Spring AOP快速入門:統(tǒng)計各個業(yè)務層方法執(zhí)行耗時

①導入依賴:在pom.xml中導入AOP的依賴
②編寫AOP程序:針對于特定方法根據(jù)業(yè)務需要進行編程
場景:
記錄操作日志
權限控制
事務管理
……
優(yōu)勢:
代碼無侵入
減少重復代碼
提高開發(fā)效率
維護方便

3.AOP核心概念
連接點:JoinPoint,可以被AOP控制的方法(暗含方法執(zhí)行時的相關信息)
通知:Advice,指哪些重復的邏輯,也就是共性功能(最終體現(xiàn)為一個方法)
切入點:PointCut,匹配連接點的條件,通知僅會在切入點方法執(zhí)行時被應用
切面:Aspect,描述通知與切入點的對應關系(通知+切入點)
目標對象:Target,通知所應用的對象


AOP執(zhí)行流程


三、AOP進階
1.通知類型

注意事項:
@Around環(huán)繞通知需要自己調用 ProceedingJoinPoint.proceed() 來讓原始方法執(zhí)行,其他通知不需要考慮目標方法執(zhí)行
@Around環(huán)繞通知方法的返回值,必須指定為Object,來接收原始方法的返回值。

@PointCut
該注解的作用是將公共的切點表達式抽取出來,需要用到時引用該切點表達式即可。

小結:
通知類型
@Before(前置通知)
@After(后置通知)
@Around(環(huán)繞通知,重點)
@AfterReturning(返回后通知,了解)
@AfterThrowing(異常后通知,了解)

2.通知順序
當有多個切面的切入點都匹配到了目標方法,目標方法運行時,多個通知方法都會被執(zhí)行。
?執(zhí)行順序
1.不同切面類中,默認按照切面類的類名字母排序:
目標方法前的通知方法:字母排名靠前的先執(zhí)行
目標方法后的通知方法:字母排名靠前的后執(zhí)行
2.用@Order(數(shù)字)加載切面類上來控制順序:
目標方法前的通知方法:數(shù)字小的先執(zhí)行
目標方法后的通知方法:數(shù)字小的后執(zhí)行


3.切入點表達式
切入點表達式@annotation
@annotation 切入點表達式,用于匹配標識有特定注解的方法。
首先自定義一個注解,用來標識方法
在方法上加入自定義注解@MyLog
小結:
1.execution(修飾符? 返回值 包名.類名.?方法名(參數(shù)) throws 異常?)
2.@annotation(注解全類名)

4.連接點
在Spring中用JoinPoint抽象了連接點,用它可以獲得方法執(zhí)行時的相關信息,如目標類名、方法名、方法參數(shù)等
對于 @Around 通知,獲取連接點信息只能使用? ProceedingJoinPoint
對于其他四種通知,獲取連接點信息只能使用 JoinPoint ,它是 ProceedingJoinPoint 的父類型



四、AOP案例
將案例中 增、刪、改 相關接口的操作日志記錄到數(shù)據(jù)庫表中。
操作日志:日志信息包含:操作人、操作時間、執(zhí)行方法的全類名、執(zhí)行方法名、方法運行時參數(shù)、返回值、方法執(zhí)行時長。
思路分析:
需要對所有業(yè)務類中的增、刪、改 方法添加統(tǒng)一功能,使用 AOP 技術最為方便(@around 環(huán)繞通知)
由于?增、刪、改 方法名沒有規(guī)律,可以自定義@Log注解完成目標方法匹配
步驟:
1.準備:
在案例工程中引入AOP的起步依賴
創(chuàng)建數(shù)據(jù)庫表結構和實體類
2.編碼:
自定義注解@Log
定義切面類,完成記錄操作日志的邏輯
獲取當前登錄用戶:
獲取request對象,從請求頭中獲取到jwt令牌,解析令牌獲取出當前用戶的id

1.引入AOP的起步依賴:
2.創(chuàng)建數(shù)據(jù)庫:
3.實體類(pojo):
4.mapper接口(mapper):
5.自定義注解@Log(anno):
6.切面類(aop):
7.在DeptController和EmpController中的增刪改方法中加入注解@Log即可
8.啟動服務,進行測試