spring AOP——名詞,語法介紹(一)
需要注意的是:springAOP 被增強的類必須是 IOC容器的bean
AOP 名詞介紹
-
切面(Aspect):一個關注點的模組化,這個關注點可能會橫切多個物件。事務管理是J2EE應用中一個關於橫切關注點的很好的例子。在Spring AOP中,切面可以使用基於模式或者基於@Aspect註解的方式來實現。
-
連線點(Joinpoint):在程式執行過程中某個特定的點,比如某方法呼叫的時候或者處理異常的時候。在Spring AOP中,一個連線點總是表示一個方法的執行。
-
通知(Advice):在切面的某個特定的連線點上執行的動作。其中包括了“around”、“before”和“after”等不同型別的通知(通知的型別將在後面部分進行討論)。許多AOP框架(包括Spring)都是以攔截器
-
引入(Introduction):用來給一個型別宣告額外的方法或屬性(也被稱為連線型別宣告(inter-type declaration))。Spring允許引入新的介面(以及一個對應的實現)到任何被代理的物件。例如,你可以使用引入來使一個bean實現IsModified介面,以便簡化快取機制。
-
目標物件(Target Object):被一個或者多個切面所通知的物件。也被稱做被通知(advised)物件。既然Spring AOP是通過執行時代理實現的,這個物件永遠是一個被代理(proxied)物件。
-
AOP代理(AOP Proxy)
-
織入(Weaving):把切面連線到其它的應用程式型別或者物件上,並建立一個被通知的物件。這些可以在編譯時(例如使用AspectJ編譯器),類載入時和執行時完成。Spring和其他純Java AOP框架一樣,在執行時完成織入。
- 切入點(Pointcut):匹配連線點的斷言。通知和一個切入點表示式關聯,並在滿足這個切入點的連線點上執行(例如,當執行某個特定名稱的方法時)。切入點表示式如何和連線點匹配是AOP的核心:Spring預設使用AspectJ切入點語法。
AOP切入點語法:
一、execution:使用“execution(方法表示式)”匹配方法執行;比較常用
模式 |
描述 |
public * *(..) |
任何公共方法的執行 |
* cn.rt..IPointcutService.*() |
cn.rt包及所有子包下IPointcutService介面中的任何無參方法 |
* cn.rt..*.*(..) |
cn.rt包及所有子包下任何類的任何方法 |
* cn.rt..IPointcutService.*(*) |
cn.rt包及所有子包下IPointcutService介面的任何只有一個引數方法 |
* (!cn.rt..IPointcutService+).*(..) |
非“cn.rt包及所有子包下IPointcutService介面及子型別”的任何方法 |
* cn.rt..IPointcutService+.*() |
cn.rt包及所有子包下IPointcutService介面及子型別的的任何無參方法 |
* cn.rt..IPointcut*.test*(java.util.Date) |
cn.rt包及所有子包下IPointcut字首型別的的以test開頭的只有一個引數型別為java.util.Date的方法,注意該匹配是根據方法簽名的引數型別進行匹配的,而不是根據執行時傳入的引數型別決定的 如定義方法:public void test(Object obj);即使執行時傳入java.util.Date,也不會匹配的; |
* cn.rt..IPointcut*.test*(..) throws IllegalArgumentException, ArrayIndexOutOfBoundsException |
cn.rt包及所有子包下IPointcut字首型別的的任何方法,且丟擲IllegalArgumentException和ArrayIndexOutOfBoundsException異常 |
* (cn.rt..IPointcutService+ && java.io.Serializable+).*(..) |
任何實現了cn.rt包及所有子包下IPointcutService介面和java.io.Serializable介面的型別的任何方法 |
@java.lang.Deprecated * *(..) |
任何持有@java.lang.Deprecated註解的方法 |
@java.lang.Deprecated @cn.rt..Secure * *(..) |
任何持有@java.lang.Deprecated和@cn.rt..Secure註解的方法 |
@(java.lang.Deprecated || cn.rt..Secure) * *(..) |
任何持有@java.lang.Deprecated或@ cn.rt..Secure註解的方法 |
(@cn.rt..Secure *) *(..) |
任何返回值型別持有@cn.rt..Secure的方法 |
* (@cn.rt..Secure *).*(..) |
任何定義方法的型別持有@cn.rt..Secure的方法 |
* *(@cn.rt..Secure (*) , @cn.rt..Secure (*)) |
任何簽名帶有兩個引數的方法,且這個兩個引數都被@ Secure標記了, 如public void test(@Secure String str1, @Secure String str1); |
* *((@ cn.rt..Secure *))或 * *(@ cn.rt..Secure *) |
任何帶有一個引數的方法,且該引數型別持有@ cn.rt..Secure; 如public void test(Model model);且Model類上持有@Secure註解 |
* *( @cn.rt..Secure (@cn.rt..Secure *) , @ cn.rt..Secure (@cn.rt..Secure *)) |
任何帶有兩個引數的方法,且這兩個引數都被@ cn.rt..Secure標記了;且這兩個引數的型別上都持有@ cn.rt..Secure;
|
* *( java.util.Map<cn.rt..Model, cn.rt..Model> , ..) |
任何帶有一個java.util.Map引數的方法,且該引數型別是以< cn.rt..Model, cn.rt..Model >為泛型引數;注意只匹配第一個引數為java.util.Map,不包括子型別; 如public void test(HashMap<Model, Model> map, String str);將不匹配,必須使用“* *( java.util.HashMap<cn.rt..Model,cn.rt..Model> , ..)”進行匹配; 而public void test(Map map, int i);也將不匹配,因為泛型引數不匹配 |
* *(java.util.Collection<@cn.rt..Secure *>) |
任何帶有一個引數(型別為java.util.Collection)的方法,且該引數型別是有一個泛型引數,該泛型引數型別上持有@cn.rt..Secure註解; 如public void test(Collection<Model> collection);Model型別上持有@cn.rt..Secure |
* *(java.util.Set<? extends HashMap>) |
任何帶有一個引數的方法,且傳入的引數型別是有一個泛型引數,該泛型引數型別繼承與HashMap; Spring AOP目前測試不能正常工作 |
* *(java.util.List<? super HashMap>) |
任何帶有一個引數的方法,且傳入的引數型別是有一個泛型引數,該泛型引數型別是HashMap的基型別;如public voi test(Map map); Spring AOP目前測試不能正常工作 |
* *(*<@cn.rt..Secure *>) |
任何帶有一個引數的方法,且該引數型別是有一個泛型引數,該泛型引數型別上持有@cn.rt..Secure註解; Spring AOP目前測試不能正常工作 |
二、within:使用“within(型別表示式)”匹配指定型別內的方法執行;
within(cn.rt..*) |
cn.rt包及子包下的任何方法執行 |
within(cn.rt..IPointcutService+) |
cn.rt包或所有子包下IPointcutService型別及子型別的任何方法 |
within(@cn.rt..Secure *) |
持有cn.rt..Secure註解的任何型別的任何方法 必須是在目標物件上宣告這個註解,在介面上宣告的對它不起作用 |
三、this:使用“this(型別全限定名)”匹配當前AOP代理物件型別的執行方法;注意是AOP代理物件的型別匹配,這樣就可能包括引入介面方法也可以匹配; 注意this中使用的表示式必須是型別全限定名,不支援萬用字元;
模式 |
描述 |
this(cn.rt.spring.chapter6.service.IPointcutService) |
當前AOP物件實現了 IPointcutService介面的任何方法 |
this(cn.rt.spring.chapter6.service.IIntroductionService) |
當前AOP物件實現了 IIntroductionService介面的任何方法 也可能是引入介面 |
四、target:使用“target(型別全限定名)”匹配當前目標物件型別的執行方法;注意是目標物件的型別匹配,這樣就不包括引入介面也型別匹配;注意target中 使用的表示式必須是型別全限定名,不支援萬用字元;
模式 |
描述 |
target(cn.rt.spring.chapter6.service.IPointcutService) |
當前目標物件(非AOP物件)實現了 IPointcutService介面的任何方法 |
target(cn.rt.spring.chapter6.service.IIntroductionService) |
當前目標物件(非AOP物件) 實現了IIntroductionService 介面的任何方法 不可能是引入介面 |
五、args:使用“args(引數型別列表)”匹配當前執行的方法傳入的引數為指定型別的執行方法;注意是匹配傳入的引數型別,不是匹配方法簽名的引數型別; 引數型別列表中的引數必須是型別全限定名,萬用字元不支援;args屬於動態切入點,這種切入點開銷非常大,非特殊情況最好不要使用;
模式 |
描述 |
args (java.io.Serializable,..) |
任何一個以接受“傳入引數型別為 java.io.Serializable” 開頭,且其後可跟任意個任意型別的引數的方法執行,args指定的引數型別是在執行時動態匹配的 |
六、@within:使用“@within(註解型別)”匹配所以持有指定註解型別內的方法;註解型別也必須是全限定型別名;
模式 |
描述 |
@within cn.rt.spring.chapter6.Secure) |
任何目標物件對應的型別持有Secure註解的類方法; 必須是在目標物件上宣告這個註解,在介面上宣告的對它不起作用 |
七、@target:使用“@target(註解型別)”匹配當前目標物件型別的執行方法,其中目標物件持有指定的註解;註解型別也必須是全限定型別名;
模式 |
描述 |
@target (cn.rt.spring.chapter6.Secure) |
任何目標物件持有Secure註解的類方法; 必須是在目標物件上宣告這個註解,在介面上宣告的對它不起作用 |
八、@args:使用“@args(註解列表)”匹配當前執行的方法傳入的引數持有指定註解的執行;註解型別也必須是全限定型別名;
模式 |
描述 |
@args (cn.rt.spring.chapter6.Secure) |
任何一個只接受一個引數的方法,且方法執行時傳入的引數持有註解 cn.rt.spring.chapter6.Secure;動態切入點,類似於arg指示符; |
九、@annotation:使用“@annotation(註解型別)”匹配當前執行方法持有指定註解的方法;註解型別也必須是全限定型別名;
模式 |
描述 |
@annotation(cn.rt.spring.chapter6.Secure ) |
當前執行方法上持有註解 cn.rt.spring.chapter6.Secure將被匹配 |
十、bean:使用“bean(Bean id或名字萬用字元)”匹配特定名稱的Bean物件的執行方法;Spring ASP擴充套件的,在AspectJ中無相應概念;
模式 |
描述 |
bean(*Service) |
匹配所有以Service命名(id或name)結尾的Bean |
十一、reference pointcut:表示引用其他命名切入點,只有@ApectJ風格支援,Schema風格不支援;
摘自:https://blog.csdn.net/zhengchao1991/article/details/53391244