Spring框架

5.2.2 JoinPoint

5.3通知

5.3.1 概述

  • 在具體的連接點(diǎn)上要執(zhí)行的操作。
  • 一個(gè)切面可以包括一個(gè)或者多個(gè)通知。
  • 通知所使用的注解的值往往是切入點(diǎn)表達(dá)式。

5.3.2?? 前置通知

  • 前置通知:在方法執(zhí)行之前執(zhí)行的通知
  • 使用@Before注解

5.3.3后置通知

  • 后置通知:后置通知是在連接點(diǎn)完成之后執(zhí)行的,即連接點(diǎn)返回結(jié)果或者拋出異常的時(shí)候
  • 使用@After注解

5.3.4返回通知

  • 返回通知:無論連接點(diǎn)是正常返回還是拋出異常,后置通知都會(huì)執(zhí)行。如果只想在連接點(diǎn)返回的時(shí)候記錄日志,應(yīng)使用返回通知代替后置通知。
  • 使用@AfterReturning注解,在返回通知中訪問連接點(diǎn)的返回值

???????? ①在返回通知中,只要將returning屬性添加到@AfterReturning注解中,就可以訪問連接點(diǎn)的返回值。該屬性的值即為用來傳入返回值的參數(shù)名稱

???????? ②必須在通知方法的簽名中添加一個(gè)同名參數(shù)。在運(yùn)行時(shí)Spring AOP會(huì)通過這個(gè)參數(shù)傳遞返回值

???????? ③原始的切點(diǎn)表達(dá)式需要出現(xiàn)在pointcut屬性中

 

5.3.5異常通知

  • 異常通知:只在連接點(diǎn)拋出異常時(shí)才執(zhí)行異常通知
  • 將throwing屬性添加到@AfterThrowing注解中,也可以訪問連接點(diǎn)拋出的異常。Throwable是所有錯(cuò)誤和異常類的頂級(jí)父類,所以在異常通知方法可以捕獲到任何錯(cuò)誤和異常。
  • 如果只對(duì)某種特殊的異常類型感興趣,可以將參數(shù)聲明為其他異常的參數(shù)類型。然后通知就只在拋出這個(gè)類型及其子類的異常時(shí)才被執(zhí)行

 

5.3.6環(huán)繞通知

  • 環(huán)繞通知是所有通知類型中功能最為強(qiáng)大的,能夠全面地控制連接點(diǎn),甚至可以控制是否執(zhí)行連接點(diǎn)。
  • 對(duì)于環(huán)繞通知來說,連接點(diǎn)的參數(shù)類型必須是ProceedingJoinPoint。它是 JoinPoint的子接口,允許控制何時(shí)執(zhí)行,是否執(zhí)行連接點(diǎn)。
  • 在環(huán)繞通知中需要明確調(diào)用ProceedingJoinPoint的proceed()方法來執(zhí)行被代理的方法。如果忘記這樣做就會(huì)導(dǎo)致通知被執(zhí)行了,但目標(biāo)方法沒有被執(zhí)行。
  • 注意:環(huán)繞通知的方法需要返回目標(biāo)方法執(zhí)行之后的結(jié)果,即調(diào)用proceed();的返回值,否則會(huì)出現(xiàn)空指針異常。

 

5.4 重用切入點(diǎn)定義

  • 在編寫AspectJ切面時(shí),可以直接在通知注解中書寫切入點(diǎn)表達(dá)式。但同一個(gè)切點(diǎn)表達(dá)式可能會(huì)在多個(gè)通知中重復(fù)出現(xiàn)。
  • 在AspectJ切面中,可以通過@Pointcut注解將一個(gè)切入點(diǎn)聲明成簡單的方法。切入點(diǎn)的方法體通常是空的,因?yàn)閷⑶腥朦c(diǎn)定義與應(yīng)用程序邏輯混在一起是不合理的。
  • 切入點(diǎn)方法的訪問控制符同時(shí)也控制著這個(gè)切入點(diǎn)的可見性。如果切入點(diǎn)要在多個(gè)切面中共用,最好將它們集中在一個(gè)公共的類中。在這種情況下,它們必須被聲明為public。在引入這個(gè)切入點(diǎn)時(shí),必須將類名也包括在內(nèi)。如果類沒有與這個(gè)切面放在同一個(gè)包中,還必須包含包名。
  • 其他通知可以通過方法名稱引入該切入點(diǎn)

5.4???? 指定切面的優(yōu)先級(jí)

  • 在同一個(gè)連接點(diǎn)上應(yīng)用不止一個(gè)切面時(shí),除非明確指定,否則它們的優(yōu)先級(jí)是不確定的。
  • 切面的優(yōu)先級(jí)可以通過實(shí)現(xiàn)Ordered接口或利用@Order注解指定。
  • 實(shí)現(xiàn)Ordered接口,getOrder()方法的返回值越小,優(yōu)先級(jí)越高。
  • 若使用@Order注解,序號(hào)出現(xiàn)在注解中