Spring框架入門必備教程-AOP面向切面編程(下篇)

AspectJ?基于注解的 AOP?實(shí)現(xiàn)
AspectJ 提供了以注解方式對于AOP 的實(shí)現(xiàn)。
(1)?實(shí)現(xiàn)步驟
A、 Step1:定義業(yè)務(wù)接口與實(shí)現(xiàn)類


B、Step2:定義切面類
類中定義了若干普通方法,將作為不同的通知方法,用來增強(qiáng)功能。

C、Step3:聲明目標(biāo)對象切面類對象

D、 Step4:注冊?AspectJ?的自動代理
在定義好切面Aspect?后,需要通知 Spring?容器,讓容器生成“目標(biāo)類+ 切面”的代理對象。這個(gè)代理是由容器自動生成的。只需要在 Spring?配置文件中注冊一個(gè)基于aspectj?的自動代理生成器,其就會自動掃描到@Aspect?注解,并按通知類型與切入點(diǎn),將其織入,并生成代理。

<aop:aspectj-autoproxy/>的底層是由AnnotationAwareAspectJAutoProxyCreator 實(shí)現(xiàn)的。從其類名就可看出, 是基于AspectJ 的注解適配自動代理生成器。
其工作原理是,<aop:aspectj-autoproxy/>通過掃描找到@Aspect?定義的切面類,再由切面類根據(jù)切入點(diǎn)找到目標(biāo)類的目標(biāo)方法,再由通知類型找到切入的時(shí)間點(diǎn)。
E、 Step5:測試類中使用目標(biāo)對象的 id

(2)?[掌握]@Before?前置通知-方法有 JoinPoint?參數(shù)
?在目標(biāo)方法執(zhí)行之前執(zhí)行。被注解為前置通知的方法,可以包含一個(gè)JoinPoint?類型參數(shù)。該類型的對象本身就是切入點(diǎn)表達(dá)式。通過該參數(shù),可獲取切入點(diǎn)表達(dá)式、方法簽名、目標(biāo)對象等。
不光前置通知的方法,可以包含一個(gè)JoinPoint 類型參數(shù),所有的通知方法均可包含該參數(shù)。

(3)?[掌握]@AfterReturning?后置通知-注解有 returning?屬性
在目標(biāo)方法執(zhí)行之后執(zhí)行。由于是目標(biāo)方法之后執(zhí)行,所以可以獲取到目標(biāo)方法的返回值。該注解的returning?屬性就是用于指定接收方法返回值的變量名的。所以,被注解為后置通知的方法,除了可以包含 JoinPoint?參數(shù)外, 還可以包含用于接收返回值的變量。該變量最好為 Object?類型,因?yàn)槟繕?biāo)方法的返回值可能是任何類型。
接口增加方法:

實(shí)現(xiàn)方法:

定義切面:

(4)?[掌握]@Around?環(huán)繞通知-增強(qiáng)方法有ProceedingJoinPoint?參數(shù)
在目標(biāo)方法執(zhí)行之前之后執(zhí)行。被注解為環(huán)繞增強(qiáng)的方法要有返回值, Object?類型。并且方法可以包含一個(gè)ProceedingJoinPoint?類型的參數(shù)。接口ProceedingJoinPoint?其有一個(gè)proceed()方法,用于執(zhí)行目標(biāo)方法。若目標(biāo)方法有返回值,則該方法的返回值就是目標(biāo)方法的返回值。最后,環(huán)繞增強(qiáng)方法將其返回值返回。該增強(qiáng)方法實(shí)際是攔截了目標(biāo)方法的執(zhí)行。
接口增加方法:

定義切面:

(5)?[了解]@AfterThrowing?異常通知-注解中有 throwing?屬性
在目標(biāo)方法拋出異常后執(zhí)行。該注解的throwing 屬性用于指定所發(fā)生的異常類對象。當(dāng)然,被注解為異常通知的方法可以包含一個(gè)參數(shù) Throwable,參數(shù)名稱為throwing 指定的名稱,表示發(fā)生的異常對象。
增加業(yè)務(wù)方法:

方法實(shí)現(xiàn):

定義切面:

(6)?[了解]@After?最終通知
無論目標(biāo)方法是否拋出異常,該增強(qiáng)均會被執(zhí)行。
增加方法:

方法實(shí)現(xiàn):

定義切面:

(7)?@Pointcut?定義切入點(diǎn)
當(dāng)較多的通知增強(qiáng)方法使用相同的execution 切入點(diǎn)表達(dá)式時(shí),編寫、維護(hù)均較為麻煩。AspectJ 提供了@Pointcut 注解,用于定義execution 切入點(diǎn)表達(dá)式。
其用法是,將@Pointcut 注解在一個(gè)方法之上,以后所有的execution 的value 屬性值均可使用該方法名作為切入點(diǎn)。代表的就是@Pointcut 定義的切入點(diǎn)。這個(gè)使用@Pointcut 注解的方法一般使用private 的標(biāo)識方法,即沒有實(shí)際作用的方法。

最后奉上視頻教程??,視頻觀看效果更佳??!走過路過別忘素質(zhì)三連哦~~

