Spring學習總結(4)——Spring學習總結

一、概念

AOP(Aspect Oriented Programming):面向切面編程。

面向切面編程(也叫面向方面編程),是目前軟件開發中的一個熱點,也是Spring框架中的一個重要內容。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。

二、用途

日誌記錄,性能統計,安全控制,權限管理,事務處理,異常處理,資源池管理。

三、詳解

注意:代碼請見下篇博文

1. 切面(Aspect)

官方的抽象定義為“一個關注點的模塊化,這個關注點可能會橫切多個對象”,在本例中,“切面”就是類TestAspect所關注的具體行為,例如:AServiceImpl.barA()的調用就是切面TestAspect所關注的行為之一。“切面”在ApplicationContext中來配置。

2. 連接點(Joinpoint)

程序執行過程中的某一行為,例如,AServiceImpl.barA()的調用或者BServiceImpl.barB(String _msg, int _type)拋出異常等行為。

3. 通知(Advice)

“切面”對於某個“連接點”所產生的動作,例如,TestAspect中對com.spring.service包下所有類的方法進行日誌記錄的動作就是一個Advice。其中,一個“切面”可以包含多個“Advice”,例如TestAspect。Advice共有如下5種類型:

A 前置通知(Before advice) :在某連接點(JoinPoint)之前執行的通知,但這個通知不能阻止連接點前的執行。xml中在裡面使用元素進行聲明;例如,TestAspect中的doBefore方法。註解中使用@Before聲明;例如,TestAnnotationAspect中的doBefore方法。

B 後通知(After advice) :當某連接點退出的時候執行的通知(不論是正常返回還是異常退出)。xml中在裡面使用元素進行聲明。例如,TestAspect中的doAfter方法,所以AOPTest中調用BServiceImpl.barB拋出異常時,doAfter方法仍然執行。註解中使用@After聲明。

C 返回後通知(After return advice) :在某連接點正常完成後執行的通知,不包括拋出異常的情況。xml中在裡面使用元素進行聲明。註解中使用@AfterReturning聲明;

D 環繞通知(Around advice) :包圍一個連接點的通知,類似Web中Servlet規範中的Filter的doFilter方法。可以在方法的調用前後完成自定義的行為,也可以選擇不執行。xml中在裡面使用元素進行聲明。例如,TestAspect中的doAround方法。註解中使用@Around聲明。

E 拋出異常後通知(After throwing advice) : 在方法拋出異常退出時執行的通知。xml中在裡面使用元素進行聲明。例如,TestAspect中的doThrowing方法。註解中使用@AfterThrowing聲明。

通知執行順序:前置通知→環繞通知連接點之前→連接點執行→環繞通知連接點之後→返回通知→後通知

→(如果發生異常)異常通知→後通知

4. 切入點(Pointcut)

匹配連接點的斷言,在AOP中通知和一個切入點表達式關聯。例如,TestAspect中的所有通知所關注的連接點,都由切入點表達式execution(* com.spring.service.*.*(..))來決定。

● 切入點表達式

execution:用於匹配方法執行的連接點;

within:用於匹配指定類型內的方法執行;

this:用於匹配當前AOP代理對象類型的執行方法;注意是AOP代理對象的類型匹配,這樣就可能包括引入接口也類型匹配;注意this中使用的表達式必須是完整類名,不支持通配符;

target:用於匹配當前目標對象類型的執行方法;注意是目標對象的類型匹配,這樣就不包括引入接口也類型匹配;注意target中使用的表達式必須是完整類名,不支持通配符;

args:用於匹配當前執行的方法傳入的參數為指定類型的執行方法;參數類型列表中的參數必須是完整類名,通配符不支持;args屬於動態切入點,這種切入點開銷非常大,非特殊情況最好不要使用;

@within:用於匹配所以持有指定註解類型內的方法;註解類型也必須是完整類名;

@target:用於匹配當前目標對象類型的執行方法,其中目標對象持有指定的註解;註解類型也必須是完整類名;

@args:用於匹配當前執行的方法傳入的參數持有指定註解的執行;註解類型也必須是完整類名;

@annotation:用於匹配當前執行方法持有指定註解的方法;註解類型也必須是完整類名;

bean:Spring AOP擴展的,AspectJ沒有對於指示符,用於匹配特定名稱的Bean對象的執行方法;

reference pointcut:表示引用其他命名切入點,只有註解風格支持,XML風格不支持。

● 匹配語法

Spring學習總結(4)——Spring學習總結

Spring學習總結(4)——Spring學習總結

● 匹配邏輯運算

可以使用且(&&)、或(||)、非(!)來組合切入點表達式。由於在XML中使用“&&”需要使用轉義字符“&&”來代替之,所以很不方便,因此Spring ASP 提供了and、or、not來代替&&、||、!。

● 切入點表達式示例

Spring學習總結(4)——Spring學習總結

Spring學習總結(4)——Spring學習總結

Spring學習總結(4)——Spring學習總結

Spring學習總結(4)——Spring學習總結

Spring學習總結(4)——Spring學習總結

Spring學習總結(4)——Spring學習總結

Spring學習總結(4)——Spring學習總結

Spring學習總結(4)——Spring學習總結

5. 目標對象(Target Object)

被一個或者多個切面所通知的對象。例如,AServcieImpl和BServiceImpl,當然在實際運行時,Spring AOP採用代理實現,實際AOP操作的是TargetObject的代理對象。

6. AOP代理(AOP Proxy)

在Spring AOP中有兩種代理方式,JDK動態代理和CGLIB代理。默認情況下,TargetObject實現了接口時,則採用JDK動態代理,例如:AServiceImpl;反之,採用CGLIB代理,例如:BServiceImpl。強制使用CGLIB代理需要將 的 proxy-target-class屬性設為true。

To小編有話說:想一起加入學習交流的小夥伴們

Spring學習總結(4)——Spring學習總結

你值得關注

---------------------

原文:https://blog.csdn.net/u012562943/article/details/49866675

---------------------

原文:https://blog.csdn.net/u012562943/article/details/49866675


分享到:


相關文章: