一、概念
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中在
B 後通知(After advice) :當某連接點退出的時候執行的通知(不論是正常返回還是異常退出)。xml中在
C 返回後通知(After return advice) :在某連接點正常完成後執行的通知,不包括拋出異常的情況。xml中在
D 環繞通知(Around advice) :包圍一個連接點的通知,類似Web中Servlet規範中的Filter的doFilter方法。可以在方法的調用前後完成自定義的行為,也可以選擇不執行。xml中在
E 拋出異常後通知(After throwing advice) : 在方法拋出異常退出時執行的通知。xml中在
通知執行順序:前置通知→環繞通知連接點之前→連接點執行→環繞通知連接點之後→返回通知→後通知
→(如果發生異常)異常通知→後通知
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風格不支持。
● 匹配語法
● 匹配邏輯運算
可以使用且(&&)、或(||)、非(!)來組合切入點表達式。由於在XML中使用“&&”需要使用轉義字符“&&”來代替之,所以很不方便,因此Spring ASP 提供了and、or、not來代替&&、||、!。
● 切入點表達式示例
5. 目標對象(Target Object)
被一個或者多個切面所通知的對象。例如,AServcieImpl和BServiceImpl,當然在實際運行時,Spring AOP採用代理實現,實際AOP操作的是TargetObject的代理對象。
6. AOP代理(AOP Proxy)
在Spring AOP中有兩種代理方式,JDK動態代理和CGLIB代理。默認情況下,TargetObject實現了接口時,則採用JDK動態代理,例如:AServiceImpl;反之,採用CGLIB代理,例如:BServiceImpl。強制使用CGLIB代理需要將
To小編有話說:想一起加入學習交流的小夥伴們
---------------------
原文:https://blog.csdn.net/u012562943/article/details/49866675
---------------------
原文:https://blog.csdn.net/u012562943/article/details/49866675
閱讀更多 Java進階架構師 的文章