基于@AspectJ的AOP語法

此文章摘抄自:<a > [濤哥]</a>

一. execution:用于匹配方法執(zhí)行的連接點;
  •     **within**:用于匹配指定類型內的方法執(zhí)行乳附;
    
  •     **this**:用于匹配當前AOP代理對象類型的執(zhí)行方法诫咱;注意是AOP代理對象的類型匹配,這樣就可能包括引入接口也類型匹配除破;
    
  •     **target**:用于匹配當前目標對象類型的執(zhí)行方法;注意是目標對象的類型匹配,這樣就不包括引入接口也類型匹配固灵;
    
  •     **args**:用于匹配當前執(zhí)行的方法傳入的參數為指定類型的執(zhí)行方法缅帘;
    
  •     **@within**:用于匹配所以持有指定注解類型內的方法轴术;
    
  •     **@target:用于匹配當前目標對象類型的執(zhí)行方法,其中目標對象持有指定的注解钦无;
    
  •     **@args**:用于匹配當前執(zhí)行的方法傳入的參數持有指定注解的執(zhí)行逗栽;
    
  •     **@annotation**:用于匹配當前執(zhí)行方法持有指定注解的方法;
    
  •     **bean**:Spring AOP擴展的失暂,AspectJ沒有對于指示符彼宠,用于匹配特定名稱的**Bean**對象的執(zhí)行方法;
    
  •     **reference pointcut**:表示引用其他命名切入點弟塞,只有@ApectJ風格支持凭峡,Schema風格不支持。
    
二.類型匹配語法

首先讓我們來了解下AspectJ類型匹配的通配符:
<b>*</b>:匹配任何數量字符宣肚;
.. :(兩個點)匹配任何數量字符的重復想罕,如在類型模式中匹配任何數量子包;而在方法參數模式中匹配任何數量參數霉涨。
** +** :匹配指定類型的子類型按价;僅能作為后綴放在類型模式后邊

表達式 說明
java.lang.String 匹配String類型
java.*.String 匹配java包下的任何“一級子包”下的String類型;如匹配java.lang.String笙瑟,但不匹配java.lang.ss.String
java..* 匹配java包及任何子包下的任何類型;如匹配java.lang.String楼镐、java.lang.annotation.Annotation
java.lang.*ing 匹配任何java.lang包下的以ing結尾的類型;
java.lang.Number+ 匹配java.lang包下的任何Number的自類型往枷;如匹配java.lang.Integer框产,也匹配java.math.BigInteger
三.組合切入點表達式

AspectJ使用 且(&&)、或(||)错洁、非(1蕖)來組合切入點表達式。
在Schema風格下屯碴,由于在XML中使用“&&”需要使用轉義字符“&&”來代替之描睦,所以很不方便,因此Spring ASP 提供了and导而、or忱叭、not來代替&&隔崎、||、韵丑!爵卒。

四.切入點使用示例
  • execution:使用“execution(方法表達式)”匹配方法執(zhí)行;
表達式 說明
public * *(..) 任何公共方法的執(zhí)行
cn.javass..IPointcutService.*() cn.javass包及所有子包下IPointcutService接口中的任何無參方法
cn.javass...(..) cn.javass包及所有子包下任何類的任何方法
cn.javass...(..) cn.javass包及所有子包下任何類的任何方法
cn.javass..IPointcutService.() cn.javass包及所有子包下IPointcutService接口的任何只有一個參數方法
(!cn.javass..IPointcutService+).*(..) 非“cn.javass包及所有子包下IPointcutService接口及子類型”的任何方法
cn.javass..IPointcutService+.*() cn.javass包及所有子包下IPointcutService接口及子類型的的任何無參方法
cn.javass..IPointcut.test(java.util.Date) cn.javass包及所有子包下IPointcut前綴類型的的以test開頭的只有一個參數類型為java.util.Date的方法撵彻,注意該匹配是根據方法簽名的參數類型進行匹配的钓株,而不是根據執(zhí)行時傳入的參數類型決定的如定義方法:public void test(Object obj);即使執(zhí)行時傳入java.util.Date,也不會匹配的千康;
cn.javass..IPointcut.test(..) throwsIllegalArgumentException, ArrayIndexOutOfBoundsException cn.javass包及所有子包下IPointcut前綴類型的的任何方法享幽,且拋出IllegalArgumentException和ArrayIndexOutOfBoundsException異常
(cn.javass..IPointcutService+&& java.io.Serializable+).*(..) 任何實現了cn.javass包及所有子包下IPointcutService接口和java.io.Serializable接口的類型的任何方法
@java.lang.Deprecated * *(..) 任何持有@java.lang.Deprecated注解的方法
@java.lang.Deprecated @cn.javass..Secure * *(..) 任何持@java.lang.Deprecated和@cn.javass..Secure注解的方法
(@cn.javass..Secure *) *(..) 任何返回值類型持有@cn.javass..Secure的方法
* (@cn.javass..Secure ).(..) 任何定義方法的類型持有@cn.javass..Secure的方法
* (@cn.javass..Secure () , @cn.javass..Secure (*)) 任何簽名帶有兩個參數的方法,且這個兩個參數都被@ Secure標記了拾弃,如public void test(@Secure String str1,@Secure String str1);
  • within:使用within(類型表達式)匹配指定類型內的方法執(zhí)行;
表達式 說明
within(cn.javass..*) cn.javass包及子包下的任何方法執(zhí)行
within(cn.javass..IPointcutService+) cn.javass包或所有子包下IPointcutService類型及子類型的任何方法
within(@cn.javass..Secure *) 持有cn.javass..Secure注解的任何類型的任何方法必須是在目標對象上聲明這個注解摆霉,在接口上聲明的對它不起作用
  • this:使用this(類型全限定名)匹配當前AOP代理對象類型的執(zhí)行方法豪椿;注意是AOP代理對象的類型匹配,這樣就可能包括引入接口方法也可以匹配携栋;注意this中使用的表達式必須是類型全限定名搭盾,不支持通配符;
表達式 說明
this(cn.javass.spring.chapter6.service.IPointcutService) 當前AOP對象實現了 IPointcutService接口的任何方法
this(cn.javass.spring.chapter6.service.IIntroductionService) 當前AOP對象實現了 IIntroductionService接口的任何方法也可能是引入接口
within(@cn.javass..Secure *) 持有cn.javass..Secure注解的任何類型的任何方法必須是在目標對象上聲明這個注解婉支,在接口上聲明的對它不起作用
  • target:使用“target(類型全限定名)”匹配當前目標對象類型的執(zhí)行方法鸯隅;注意是目標對象的類型匹配,這樣就不包括引入接口也類型匹配向挖;注意target中使用的表達式必須是類型全限定名蝌以,不支持通配符;
表達式 說明
target(cn.javass.spring.chapter6.service.IPointcutService) 當前目標對象(非AOP對象)實現了 IPointcutService接口的任何方法
target(cn.javass.spring.chapter6.service.IIntroductionService) 當前目標對象(非AOP對象) 實現了IIntroductionService 接口的任何方法不可能是引入接口
  • args:使用args(參數類型列表)”匹配當前執(zhí)行的方法傳入的參數為指定類型的執(zhí)行方法何之;注意是匹配傳入的參數類型跟畅,不是匹配方法簽名的參數類型;參數類型列表中的參數必須是類型全限定名溶推,通配符不支持徊件;args屬于動態(tài)切入點,這種切入點開銷非常大蒜危,非特殊情況最好不要使用虱痕;
表達式 說明
args (java.io.Serializable,..) 任何一個以接受“傳入參數類型為 java.io.Serializable” 開頭,且其后可跟任意個任意類型的參數的方法執(zhí)行辐赞,args指定的參數類型是在運行時動態(tài)匹配的
  • @within:使用“@within(注解類型)”匹配所以持有指定注解類型內的方法部翘;注解類型也必須是全限定類型名;
表達式 說明
@within cn.javass.spring.chapter6.Secure) 任何目標對象對應的類型持有Secure注解的類方法占拍;必須是在目標對象上聲明這個注解略就,在接口上聲明的對它不起作用
  • @target:使用“@target(注解類型)”匹配當前目標對象類型的執(zhí)行方法捎迫,其中目標對象持有指定的注解;注解類型也必須是全限定類型名表牢;
表達式 說明
@target (cn.javass.spring.chapter6.Secure) 任何目標對象持有Secure注解的類方法窄绒;必須是在目標對象上聲明這個注解,在接口上聲明的對它不起作用
  • @args:使用“@args(注解列表)”匹配當前執(zhí)行的方法傳入的參數持有指定注解的執(zhí)行崔兴;注解類型也必須是全限定類型名彰导;
表達式 說明
@args (cn.javass.spring.chapter6.Secure) 任何一個只接受一個參數的方法,且方法運行時傳入的參數持有注解 cn.javass.spring.chapter6.Secure敲茄;動態(tài)切入點位谋,類似于arg指示符;
  • @annotation:使用@annotation(注解類型)匹配當前執(zhí)行方法持有指定注解的方法堰燎;注解類型也必須是全限定類型名掏父;
表達式 說明
@annotation(cn.javass.spring.chapter6.Secure ) 當前執(zhí)行方法上持有注解 cn.javass.spring.chapter6.Secure將被匹配
  • bean:使用“bean(Bean id或名字通配符)匹配特定名稱的Bean對象的執(zhí)行方法;Spring ASP擴展的秆剪,在AspectJ**中無相應概念赊淑;
表達式 說明
bean(*Service) 匹配所有以Service命名(id或name)結尾的Bean
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市仅讽,隨后出現的幾起案子陶缺,更是在濱河造成了極大的恐慌,老刑警劉巖洁灵,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饱岸,死亡現場離奇詭異,居然都是意外死亡徽千,警方通過查閱死者的電腦和手機苫费,發(fā)現死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罐栈,“玉大人黍衙,你說我怎么就攤上這事≤埽” “怎么了琅翻?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柑贞。 經常有香客問我方椎,道長,這世上最難降的妖魔是什么钧嘶? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任棠众,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘闸拿。我一直安慰自己空盼,他們只是感情好,可當我...
    茶點故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布新荤。 她就那樣靜靜地躺著揽趾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苛骨。 梳的紋絲不亂的頭發(fā)上篱瞎,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天,我揣著相機與錄音痒芝,去河邊找鬼俐筋。 笑死,一個胖子當著我的面吹牛严衬,可吹牛的內容都是我干的澄者。 我是一名探鬼主播,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼瞳步,長吁一口氣:“原來是場噩夢啊……” “哼闷哆!你這毒婦竟也來了?” 一聲冷哼從身側響起单起,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劣坊,沒想到半個月后嘀倒,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡局冰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年测蘑,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片康二。...
    茶點故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡碳胳,死狀恐怖,靈堂內的尸體忽然破棺而出沫勿,到底是詐尸還是另有隱情挨约,我是刑警寧澤,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布产雹,位于F島的核電站诫惭,受9級特大地震影響,放射性物質發(fā)生泄漏蔓挖。R本人自食惡果不足惜夕土,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘟判。 院中可真熱鬧怨绣,春花似錦角溃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咽扇,卻和暖如春邪财,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背质欲。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工树埠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嘶伟。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓怎憋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親九昧。 傳聞我的和親對象是個殘疾皇子绊袋,可洞房花燭夜當晚...
    茶點故事閱讀 43,687評論 2 351

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發(fā)現铸鹰,斷路器癌别,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 國家電網公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,934評論 6 13
  • Via http://jinnianshilongnian.iteye.com/blog/1415606 http...
    xiaobinZh閱讀 1,559評論 0 52
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,778評論 6 342
  • 2017.6.22 周四 小雨 今天的培訓學習主要是關于送禮加好友的具體方法只祠,分為群里送禮品推薦好友和朋友圈送...
    李凡520閱讀 253評論 0 0