1. 程式人生 > >spring AOP——名詞,語法介紹(一)

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)

    :AOP框架建立的物件,用來實現切面契約(例如通知方法執行等等)。在Spring中,AOP代理可以是JDK動態代理或者CGLIB代理。

  • 織入(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