p.s.這是萌新自己自學總結的筆記,如果想學習得更透徹的話還是請去看大佬的講解
目錄
- 事務
- spring事物管理
- 事物屬性--回滾
- 事物屬性--傳播行為(propagation)
- AOP
- 一些核心概念
- 通知類型
- 通知的執行順序
- 切入點表達式
- execution
- `@annotation`
- 連接點
事務
事物是一組操作的集合,它是一個不可分割的工作單位,這些操作要么同時成功,要么同時失敗
操作:
開啟事務:一組操作前,開啟事務 start transaction / begin
提交事務:這組操作全部成功后,提交事物 commit
回滾事務:中間的任何一個操作出現異常,回滾事務 rollback
spring事物管理
注解:@Transactional
位置:業務(service)層的方法上、類上、接口上
作用:將當前方法交給spring進行事物管理,方法執行前,開啟事務;成功執行完畢后,提交事物;出現異常,回滾事務
事物屬性–回滾
默認情況下,只有出現RuntimeException才回滾異常。rollbackFor屬性用于控制出現何種異常類型 ,回滾事務
事物屬性–傳播行為(propagation)
事務傳播行為:指的就是當一個事務方法被另一個事務方法調用時,這個事務方法應該如何進行事務控制
REQUIRED傳播行為?:適用于大多數情況,是常用的事務傳播方式。
REQUIRES_NEW傳播行為?:用于需要獨立事務的場景,如訂單處理前記錄日志。此方式確保日志記錄不受訂單處理結果影響,無論訂單成功與否,日志都能成功記錄。
AOP
AOP (Aspect Orient Programming):面向切面編程、面向方面編程;其實就是面向特定方法編程
場景:案例部分功能運行較慢,定位執行耗時較長的業務方法,此時需要統計每一個業務方法的執行耗時
實現:動態代理是面向切面編程最主流的實現。而SpringAOP是Spring框架的高級技術,旨在管理bean對象的過程中,主要通過底層的動態代理機制,對特定的方法進行編程
AOP可用于記錄操作日志、權限控制、事務管理等等
優點:代碼無侵入、減少重復代碼、提高開發效率、維護方便
一些核心概念
連接點,JoinPoint:即一個可以被AOP控制的方法(暗含方法執行時的相關信息)
通知,Advice:指那些重復的邏輯,也就是共性的功能(最終體現為一個方法)
切入點,PointCut:匹配連接點的條件,通知僅會在切入點方法執行時被應用
切面,Aspect:描述通知與切入點的對應關系(通知+切入點)
目標對象,Target:通知所應用的對象
通知類型
@Around
:環境通知,此注解標注的通知方法在目標方法前、后都被執行
@Before
:前置通知,此注解標注的通知方法在目標方法前被執行
@After
:后置通知,此注解標注的通知方法在目標方法后被執行,無論是否有異常都會執行
@AfterReturning
:返回后通知,此注解標注的通知方法在目標方法后被執行,有異常不會執行
@AfterThrowing
:異常后通知,此注解標注的通知方法發生異常后執行
注意
@Around
環繞通知需要自己調用ProceedingJoinPoint.proceed() 來讓原始方法執行,其他通知不需要考慮目標方法執行
@Around
環繞通知方法的返回值,必須指定為Object,來接受原始方法的返回值
.
@PointCut
:
該注解的作用是將公共的切點表達式抽取出來,需要用到時引用該切點表達式即可
通知的執行順序
當有多個切面的切入點都匹配到了目標方法,目標方法運行時,多個通知方法都會被執行
執行順序為:
不同切面類中,默認按照切面類的類名字母排序
目標方法前的通知方法:字母排名靠前的先執行
目標方法后的通知方法:字母排名靠后的先執行
可以使用@Order(數字)
加在切面上來控制順序:
目標方法前的通知方法:數字小的先執行
目標方法后的通知方法:數字大的先執行
切入點表達式
切入點表達式:描述切入點方式的一種表達式
作用:主要用來決定項目中的哪些方法需要加入通知
常見形式:
1:execution(...)
根據方法的簽名來執行
2:@annotation(...)
根據注解匹配
execution
execution主要根據方法的返回值、包名、類名、方法名、方法參數等信息來匹配,語法為:
execution(訪問修飾符 返回值 包名.類名.方法名(方法參數) throws 異常)
其中訪問修飾符、包名.類名、throws 異常可省略
其中可以使用通配符描述切入點
*
:單個獨立的任意符號;可通配:任意返回值、包名、類名、方法名、任意類型的一個參數
execution(* com..service..update())
…:多個連續的任意符號;可通配:任意層級的包,或任意類型、任意個數的參數
execution(* com.itheima..DeptService.*(..))
根據業務需要,可以使用且(&&)、或(||)、非(!)來組合比較復雜的切入點表達式
書寫建議
● 所有業務方法名在命名時盡量規范,方便切入點表達式快速匹配。如:查詢類方法都是 find 開頭,更新類方法都是 update開頭。
● 描述切入點方法通常基于接口描述,而不是直接描述實現類,增強拓展性。
● 在滿足業務需要的前提下,盡量縮小切入點的匹配范圍。如:包名匹配盡量不使用…,使用*匹配單個包。
@annotation
@annotation
切入點表達式,用于匹配標識有特定注解的方法
連接點
在Spring中用JoinPoint抽象了連接點,用它可以獲得方法執行時的相關信息 ,如目標類名、方法名、方法參數等
對于@Around
通知,獲取連接點信息只能使用ProceedingJoinPoint
對于其他四種通知,獲取連接點信息只能使用JoinPoint,它是ProceedingJoinPoint的父類