springboot aop

連接點(diǎn) JointPoint

表示需要在程序中插入橫切關(guān)注點(diǎn)的擴(kuò)展點(diǎn)奈懒,連接點(diǎn)可能是類初
始化区宇、方法執(zhí)行泌豆、方法調(diào)用救欧、字段調(diào)用或處理異常等等衰粹,Spring
只支持方法執(zhí)行連接點(diǎn)

切入點(diǎn) Pointcut

選擇一組相關(guān)連接點(diǎn)的模式,即可以認(rèn)為連接點(diǎn)的集合笆怠,Spring
支持perl5正則表達(dá)式和AspectJ切入點(diǎn)模式铝耻,Spring默認(rèn)使用
AspectJ語法

通知 Advice

在連接點(diǎn)上執(zhí)行的行為,通知提供了在AOP中需要在切入點(diǎn)所選
擇的連接點(diǎn)處進(jìn)行擴(kuò)展現(xiàn)有行為的手段;在Spring中通過代理模
式實(shí)現(xiàn)AOP

方面/切面 Aspect

橫切關(guān)注點(diǎn)的模塊化瓢捉,比如上邊提到的日志組件频丘。可以認(rèn)為是通知泡态、引入和切入點(diǎn)的組合搂漠;在Spring中可以使用Schema和@AspectJ方式進(jìn)行組織實(shí)現(xiàn)。

目標(biāo)對(duì)象 Target Object

需要被織入橫切關(guān)注點(diǎn)的對(duì)象某弦,即該對(duì)象是切入點(diǎn)選擇的對(duì)象桐汤,需
要被通知的對(duì)象,從而也可稱為“被通知對(duì)象”靶壮;由于Spring
AOP 通過代理模式實(shí)現(xiàn)怔毛,從而這個(gè)對(duì)象永遠(yuǎn)是被代理對(duì)象。

AOP代理 AOP Proxy

AOP框架使用代理模式創(chuàng)建的對(duì)象腾降,從而實(shí)現(xiàn)在連接點(diǎn)處插入通
知(即應(yīng)用切面)拣度,就是通過代理來對(duì)目標(biāo)對(duì)象應(yīng)用切面。在
Spring中蜂莉,AOP代理可以用JDK動(dòng)態(tài)代理或CGLIB代理實(shí)現(xiàn)蜡娶,而通
過攔截器模型應(yīng)用切面混卵。

織入 Weaving

織入是一個(gè)過程映穗,是將切面應(yīng)用到目標(biāo)對(duì)象從而創(chuàng)建出AOP代理對(duì)象的過程,織入可以在編譯期幕随、類裝載期蚁滋、運(yùn)行期進(jìn)行。

前置通知 Before Advice

在切入點(diǎn)選擇的連接點(diǎn)處的方法之前執(zhí)行的通知赘淮,該通知不影響正常程序執(zhí)行流程辕录。

后置通知 After Advice

? 在切入點(diǎn)選擇的連接點(diǎn)處的方法之后執(zhí)行的通知
? 后置返回通知(After returning Advice)
? 后置異常通知(After throwing Advice)
? 后置最終通知(After finally Advice)

環(huán)繞通知 Around Advice

? 環(huán)繞著在切入點(diǎn)選擇的連接點(diǎn)處的方法所執(zhí)行的通知


實(shí)例
實(shí)例

定義切入點(diǎn),就是執(zhí)行的條件梢卸。切入點(diǎn)的方法不用任何代碼走诞,返回值是void,最重要的是執(zhí)行的條件的表達(dá)式蛤高。

@Pointcut("execution(* com.test.service.*.*(..))")
    public void executeService()
    {

    }
1)execution:用于匹配子表達(dá)式蚣旱。

            //匹配com.cjm.model包及其子包中所有類中的所有方法,返回類型任意戴陡,方法參數(shù)任意
            @Pointcut("execution(* com.cjm.model..*.*(..))")
            public void before(){}

 

      2)within:用于匹配連接點(diǎn)所在的Java類或者包塞绿。

            //匹配Person類中的所有方法
            @Pointcut("within(com.cjm.model.Person)")
            public void before(){}

 

            //匹配com.cjm包及其子包中所有類中的所有方法

            @Pointcut("within(com.cjm..*)")
            public void before(){}

 

     3) this:用于向通知方法中傳入代理對(duì)象的引用。
            @Before("before() && this(proxy)")
            public void beforeAdvide(JoinPoint point, Object proxy){
                  //處理邏輯
            }

 

      4)target:用于向通知方法中傳入目標(biāo)對(duì)象的引用恤批。
            @Before("before() && target(target)
            public void beforeAdvide(JoinPoint point, Object proxy){
                  //處理邏輯
            }

 

      5)args:用于將參數(shù)傳入到通知方法中异吻。
            @Before("before() && args(age,username)")
            public void beforeAdvide(JoinPoint point, int age, String username){
                  //處理邏輯
            }
 
      6)@within :用于匹配在類一級(jí)使用了參數(shù)確定的注解的類,其所有方法都將被匹配喜庞。 

            @Pointcut("@within(com.cjm.annotation.AdviceAnnotation)") - 所有被@AdviceAnnotation標(biāo)注的類都將匹配
            public void before(){}

  

      7)@target :和@within的功能類似诀浪,但必須要指定注解接口的保留策略為RUNTIME棋返。
            @Pointcut("@target(com.cjm.annotation.AdviceAnnotation)")
            public void before(){}

 

      8)@args :傳入連接點(diǎn)的對(duì)象對(duì)應(yīng)的Java類必須被@args指定的Annotation注解標(biāo)注。
            @Before("@args(com.cjm.annotation.AdviceAnnotation)")
            public void beforeAdvide(JoinPoint point){
                  //處理邏輯
            }

  

      9)@annotation :匹配連接點(diǎn)被它參數(shù)指定的Annotation注解的方法雷猪。也就是說懊昨,所有被指定注解標(biāo)注的方法都將匹配。
            @Pointcut("@annotation(com.cjm.annotation.AdviceAnnotation)")
            public void before(){}

      10)bean:通過受管Bean的名字來限定連接點(diǎn)所在的Bean春宣。該關(guān)鍵詞是Spring2.5新增的酵颁。
            @Pointcut("bean(person)")
            public void before(){}

請(qǐng)注意我們使用了“&&”操作符把execution()和within()指示器連接在一起形成與(and)關(guān)系(切點(diǎn)必須匹配所有的指示器)。類似地,我們可以使用“||”操作符來標(biāo)識(shí)或(or)關(guān)系,而使用“!”操
作符來標(biāo)識(shí)非(not)操作月帝。
因?yàn)椤?amp;”在XML中有特殊含義,所以在Spring的XML配置里面描述切點(diǎn)時(shí),我們可以使用and來代替“&&”躏惋。同樣,or和not可以分別用來代替“||”和“!”。

通知參數(shù)

任何通知方法可以將第一個(gè)參數(shù)定義為org.aspectj.lang.JoinPoint類型(環(huán)繞通知需要定義第一個(gè)參數(shù)為ProceedingJoinPoint類型嚷辅,它是 JoinPoint 的一個(gè)子類)簿姨。JoinPoint接口提供了一系列有用的方法,比如 getArgs()(返回方法參數(shù))簸搞、getThis()(返回代理對(duì)象)扁位、getTarget()(返回目標(biāo))、getSignature()(返回正在被通知的方法相關(guān)信息)和 toString()(打印出正在被通知的方法的有用信息)

切入點(diǎn)表達(dá)式

定義切入點(diǎn)時(shí)需要一個(gè)包含名字和任意參數(shù)的簽名趁俊,還有一個(gè)切入點(diǎn)表達(dá)式域仇,就是* findById*(..)這一部分。
  切入點(diǎn)表達(dá)式的格式:execution([可見性] 返回類型 [聲明類型].方法名(參數(shù)) [異常])
  其中【】中的為可選寺擂,其他的還支持通配符的使用:
  *:匹配所有字符
..:一般用于匹配多個(gè)包暇务,多個(gè)參數(shù)
+:表示類及其子類
  運(yùn)算符有:&&、||怔软、!

在使用spring框架配置AOP的時(shí)候垦细,不管是通過XML配置文件還是注解的方式都需要定義pointcut”切入點(diǎn)”
例如定義切入點(diǎn)表達(dá)式 execution (* com.sample.service.impl..*. *(..))

execution()是最常用的切點(diǎn)函數(shù),其語法如下所示:

整個(gè)表達(dá)式可以分為五個(gè)部分:

1挡逼、execution(): 表達(dá)式主體括改。
2、第一個(gè)*號(hào):表示返回類型家坎, *號(hào)表示所有的類型嘱能。
3、包名:表示需要攔截的包名乘盖,后面的兩個(gè)句點(diǎn)表示當(dāng)前包和當(dāng)前包的所有子包焰檩,com.sample.service.impl包、子孫包下所有類的方法订框。
4析苫、第二個(gè)*號(hào):表示類名,*號(hào)表示所有的類。
5衩侥、*(..):最后這個(gè)星號(hào)表示方法名国旷,*號(hào)表示所有的方法,后面括弧里面表示方法的參數(shù)茫死,兩個(gè)句點(diǎn)表示任何參數(shù)

相關(guān)博客:
http://www.cnblogs.com/lic309/p/4079194.html
http://blog.csdn.net/lk7688535/article/details/51989746

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跪但,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子峦萎,更是在濱河造成了極大的恐慌屡久,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爱榔,死亡現(xiàn)場離奇詭異被环,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)详幽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門筛欢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唇聘,你說我怎么就攤上這事版姑。” “怎么了迟郎?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵剥险,是天一觀的道長。 經(jīng)常有香客問我谎亩,道長炒嘲,這世上最難降的妖魔是什么宇姚? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任匈庭,我火速辦了婚禮,結(jié)果婚禮上浑劳,老公的妹妹穿的比我還像新娘阱持。我一直安慰自己,他們只是感情好魔熏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布衷咽。 她就那樣靜靜地躺著,像睡著了一般蒜绽。 火紅的嫁衣襯著肌膚如雪镶骗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天躲雅,我揣著相機(jī)與錄音鼎姊,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛相寇,可吹牛的內(nèi)容都是我干的慰于。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼唤衫,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼婆赠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起佳励,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤休里,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后赃承,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體份帐,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年楣导,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了废境。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筒繁,死狀恐怖噩凹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毡咏,我是刑警寧澤驮宴,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站呕缭,受9級(jí)特大地震影響堵泽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恢总,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一迎罗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧片仿,春花似錦纹安、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至阳距,卻和暖如春塔粒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背筐摘。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國打工卒茬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留映跟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓扬虚,卻偏偏與公主長得像努隙,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辜昵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容