• <em id="6vhwh"><rt id="6vhwh"></rt></em>

    <style id="6vhwh"></style>

    <style id="6vhwh"></style>
    1. <style id="6vhwh"></style>
        <sub id="6vhwh"><p id="6vhwh"></p></sub>
        <p id="6vhwh"></p>
          1. 国产亚洲欧洲av综合一区二区三区 ,色爱综合另类图片av,亚洲av免费成人在线,久久热在线视频精品视频,成在人线av无码免费,国产精品一区二区久久毛片,亚洲精品成人片在线观看精品字幕 ,久久亚洲精品成人av秋霞

            Spring AOP AspectJ切入點語法詳解,execution,within,this_

            更新時間:2024-03-20 10:26:01 閱讀: 評論:0

            2024年3月20日發(作者:武松打虎縮寫)

            Spring AOP AspectJ切入點語法詳解,execution,within,this_

            6.5.1 Spring AOP支持的AspectJ切入點指示符

            切入點指示符用來指示切入點表達式目的,,在Spring AOP中目前只有

            執行方法這一個連接點,Spring AOP支持的AspectJ切入點指示符如下:

            execution

            用于匹配方法執行的連接點;

            within

            this

            用于匹配指定類型內的方法執行;

            用于匹配當前

            AOP

            代理對象類型的執行方法;

            注意是

            AOP

            代理對象的類型匹配,這樣就可能

            包括引入接口也類型匹配;

            用于匹配當前目標對象類型的執行方法;注意是

            target

            目標對象的類型匹配,這樣就不包括引入接口也

            類型匹配;

            args

            @within

            @target

            @args

            @annotat

            ion

            bean

            reference

            pointcut

            用于匹配當前執行的方法傳入的參數為指定類

            型的執行方法;

            用于匹配所以持有指定注解類型內的方法;

            用于匹配當前目標對象類型的執行方法,其中目

            標對象持有指定的注解;

            用于匹配當前執行的方法傳入的參數持有指定

            注解的執行;

            用于匹配當前執行方法持有指定注解的方法;

            Spring AOP

            擴展的,

            AspectJ

            沒有對于指示

            符,用于匹配特定名稱的

            Bean

            對象的執行方

            法;

            表示引用其他命名切入點,只有

            @ApectJ

            風格

            支持,

            Schema

            風格不支持。

            AspectJ切入點支持的切入點指示符還有: call、get、t、preinitializatio

            n、staticinitialization、initialization、handler、adviceexecution、withi

            ncode、cflow、cflowbelow、if、@this、@withincode;但Spring AOP

            目前不支持這些指示符,使用這些指示符將拋出IllegalArgumentException

            異常。這些指示符Spring AOP可能會在以后進行擴展。

            6.5.1 命名及匿名切入點

            命名切入點可以被其他切入點引用,而匿名切入點是不可以的。

            只有@AspectJ支持命名切入點,而Schema風格不支持命名切入點。

            如下所示,@AspectJ使用如下方式引用命名切入點:

            6.5.2 ;類型匹配語法

            首先讓我們來了解下AspectJ類型匹配的通配符:

            *:匹配任何數量字符;

            ..:匹配任何數量字符的重復,如在類型模式中匹配任何數量子包;而

            在方法參數模式中匹配任何數量參數。

            +:

            匹配指定類型的子類型;僅能作為后綴放在類型模式后邊。

            1. 匹配String類型;

            2. java.*.String 匹配java包下的任何“一級子包”下的String類型;

            3. 如匹配,但不匹配

            4. java..* 匹配java包及任何子包下的任何類型;

            5. 如匹配、tion

            6. .*ing 匹配任何包下的以ing結尾的類型;

            7. + 匹配包下的任何Number的自類型;

            8. 如匹配r,也匹配eger

            接下來再看一下具體的匹配表達式類型吧:

            匹配類型:

            使用如下方式匹配

            1. 注解? 類的全限定名字

            ?

            ?

            注解:可選,類型上持有的注解,如@Deprecated;

            類的全限定名:必填,可以是任何類全限定名。

            匹配方法執行:

            使用如下方式匹配:

            1. 注解? 修飾符? 返回值類型 類型聲明?方法名(參數列表) 異常列表?

            ?

            ?

            ?

            ?

            ?

            ?

            注解:可選,方法上持有的注解,如@Deprecated;

            修飾符:可選,如public、protected;

            返回值類型:必填,可以是任何類型模式;“*”表示所有類型;

            類型聲明:可選,可以是任何類型模式;

            方法名:必填,可以使用“*”進行模式匹配;

            參數列表:“()”表示方法沒有任何參數;“(..)”表示匹配接受任意個參數的方法,“(..,)”

            表示匹配接受類型的參數結束,且其前邊可以接受有任意個參數的方法;“(.

            String,..)” 表示匹配接受類型的參數開始,且其后邊可以接受任意個參數的方法;“(*,

            )” 表示匹配接受類型的參數結束,且其前邊接受有一個任意類型參

            數的方法;

            ?

            異常列表:可選,以“throws 異常全限定名列表”聲明,異常全限定名列表如有多個以“,”分割,如thro

            ws lArgumentException, ndexOutOfBoundsException。

            匹配Bean名稱:

            可以使用Bean的id或name進行匹配,并且可使用通

            配符“*”;

            6.5.3 組合切入點表達式

            AspectJ使用 且(&&)、或(||)、非(!)來組合切入點表達式。

            在Schema風格下,由于在XML中使用“&&”需要使用轉義字符“&

            &”來代替之,所以很不方便,因此Spring ASP 提供了and、or、not

            來代替&&、||、!。

            6.5.3 切入點使用示例

            一、execution:

            使用“execution(方法表達式)”匹配方法執行;

            模式

            public * *(..)

            * ..IPointcutService.*()

            任何公共方法的執行

            描述

            包及所有子包下IPointcutService接口中

            的任何無參方法

            * ..*.*(..)

            * ..IPointcutService.*(*)

            包及所有子包下任何類的任何方法

            包及所有子包下IPointcutService接口的

            任何只有一個參數方法

            *

            (!..IPointcutService+).*(..)

            * ..IPointcutService+.*()

            非“包及所有子包下IPointcutService接口

            及子類型”的任何方法

            包及所有子包下IPointcutService接口及

            子類型的的任何無參方法

            *

            ..IPointcut*.test*(.

            Date)

            包及所有子包下IPointcut前綴類型的的以

            test開頭的只有一個參數類型為的方

            法,注意該匹配是根據方法簽名的參數類型進行匹配的,

            而不是根據執行時傳入的參數類型決定的

            如定義方法:public void test(Object obj);即使執行

            時傳入,也不會匹配的;

            *

            ..IPointcut*.test*(..) thro

            ws

            IllegalArgumentException,

            ArrayIndexOutOfBoundsException

            * (..IPointcutService+

            && izable+).*(..)

            包及所有子包下IPointcut前綴類型的的任

            何方法,且拋出IllegalArgumentException和

            ArrayIndexOutOfBoundsException異常

            任何實現了包及所有子包下

            IPointcutService接口和izable接口的

            類型的任何方法

            @ated * *(..)

            @ated

            @..Secure * *(..)

            @(ated ||

            ..Secure) * *(..)

            (@..Secure *) *(..)

            * (@..Secure *).*(..)

            * *(@..Secure (*) ,

            @..Secure (*))

            任何持有@ated注解的方法

            任何持有@ated和

            @..Secure注解的方法

            任何持有@ated或@

            ..Secure注解的方法

            任何返回值類型持有@..Secure的方法

            任何定義方法的類型持有@..Secure的方法

            任何簽名帶有兩個參數的方法,且這個兩個參數都被@

            Secure標記了,

            如public void test(@Secure String str1,

            @Secure String str1);

            * *((@ ..Secure *))或

            * *(@ ..Secure *)

            任何帶有一個參數的方法,且該參數類型持有@

            ..Secure;

            如public void test(Model model);且Model類上持

            有@Secure注解

            * *(

            @..Secure

            (@..Secure *) ,

            @ ..Secure

            (@..Secure *))

            * *(

            <..Model,

            ..Model>

            , ..)

            任何帶有兩個參數的方法,且這兩個參數都被@

            ..Secure標記了;且這兩個參數的類型上都

            持有@ ..Secure;

            任何帶有一個參數的方法,且該參數類

            型是以< ..Model, ..Model >為

            泛型參數;注意只匹配第一個參數為,不

            包括子類型;

            如public void test(HashMap

            map, String str);將不匹配,必須使用“* *(

            p<..Model,..

            Model>

            , ..)”進行匹配;

            而public void test(Map map, int i);也將不匹配,因

            為泛型參數不匹配

            *

            *(tion<@..S

            ecure *>)

            任何帶有一個參數(類型為tion)的方

            法,且該參數類型是有一個泛型參數,該泛型參數類型

            上持有@..Secure注解;

            如public void test(Collection

            collection);Model類型上持有@..Secure

            * *(<? extends

            HashMap>)

            任何帶有一個參數的方法,且傳入的參數類型是有一個

            泛型參數,該泛型參數類型繼承與HashMap;

            Spring AOP目前測試不能正常工作

            * *(<? super

            HashMap>)

            任何帶有一個參數的方法,且傳入的參數類型是有一個

            泛型參數,該泛型參數類型是HashMap的基類型;如

            public voi test(Map map);

            Spring AOP目前測試不能正常工作

            * *(*<@..Secure *>)

            任何帶有一個參數的方法,且該參數類型是有一個泛型

            參數,該泛型參數類型上持有@..Secure注

            解;

            Spring AOP目前測試不能正常工作

            within:使用“within(類型表達式)”

            匹配指定類型內的方法執行;

            模式

            within(..*)

            包及子包下的任何方法執行

            描述

            within(..IPointcutService+)

            包或所有子包下IPointcutService類型及子類型的任何方法

            within(@..Secure *)

            持有..Secure注解的任何類型的任何方法

            必須是在目標對象上聲明這個注解,在接口上聲明的對它不起作用

            this

            :使用

            “this(

            類型全限定名

            )”

            匹配當前

            AOP

            代理對象類型的執行方法;注意

            AOP

            代理對象的類型匹配,這樣就可能包括引入接口方法也可以匹配;注意

            this

            使用的表達式必須是類型全限定名,不支持通配符;

            模式

            this(cutService)

            描述

            當前AOP對象實現了

            IPointcutService接口

            的任何方法

            this(ductionService)

            當前AOP對象實現了

            IIntroductionService

            接口的任何方法

            也可能是引入接口

            四、

            target

            :使用

            “target(

            類型全限定名

            )”

            匹配當前目標對象類型的執行方法;注意

            是目標對象的類型匹配,這樣就不包括引入接口也類型匹配;注意

            target

            中使用的表

            達式必須是類型全限定名,不支持通配符;

            模式

            target(cutService)

            描述

            當前目標對象(非AOP

            對象)實現了

            IPointcutService接

            口的任何方法

            target(ductionServic

            e)

            當前目標對象(非AOP

            對象) 實現了

            IIntroductionServic

            e 接口的任何方法

            不可能是引入接口

            五、

            args

            :使用

            “args(

            參數類型列表

            )”

            匹配當前執行的方法傳入的參數為指定類型的

            執行方法;注意是匹配傳入的參數類型,不是匹配方法簽名的參數類型;參數類型列表

            中的參數必須是類型全限定名,通配符不支持;

            args

            屬于動態切入點,這種切入點開

            銷非常大,非特殊情況最好不要使用;

            模式

            args (izable,..)

            描述

            任何一個以接受“傳入參數類型為 izable” 開

            頭,且其后可跟任意個任意類型的參數的方法執行,args指

            定的參數類型是在運行時動態匹配的

            六、

            @within

            :使用

            “@within(

            注解類型

            )”

            匹配所以持有指定注解類型內的方法;注

            解類型也必須是全限定類型名;

            模式

            @within

            描述

            任何目標對象對應的類型持有Secure注解的類方法;

            起作用

            在接口上聲明的對它不

            )

            必須是在目標對象上聲明這個注解,

            七、

            @target

            :使用

            “@target(

            注解類型

            )”

            匹配當前目標對象類型的執行方法,其中

            目標對象持有指定的注解;注解類型也必須是全限定類型名;

            模式

            @target

            描述

            任何目標對象持有Secure注解的類方法;

            不起作用

            ()

            必須是在目標對象上聲明這個注解,在接口上聲明的對它

            八、

            @args

            :使用

            “@args(

            注解列表

            )”

            匹配當前執行的方法傳入的參數持有指

            定注解的執行;注解類型也必須是全限定類型名;

            模式

            @args

            描述

            任何一個只接受一個參數的方法,且方法運行時傳入的參

            切入點,類似于arg指示符;

            ()

            數持有注解 ;動態

            九、

            @annotation

            :使用

            “@annotation(

            注解類型

            )”

            匹配當前執行方法持有

            指定注解的方法;注解類型也必須是全限定類型名;

            模式 描述

            @annotation( )

            當前執行方法上持有注解

            將被匹配

            十、

            bean

            :使用

            “bean(Bean id

            或名字通配符

            )”

            匹配特定名稱的

            Bean

            對象

            的執行方法;

            Spring ASP

            擴展的,在

            AspectJ

            中無相應概念;

            模式

            bean(*Service)

            描述

            匹配所有以Service命名(id或name)結尾的Bean

            十一、reference pointcut:

            表示引用其他命名切入點,

            只有@ApectJ風格支持,Schema風格不支持,

            如下所示:

            比如我們定義如下切面:

            1. package ;

            2. import ;

            3. import ut;

            4. @Aspect

            5. public class ReferencePointcutAspect {

            6. @Pointcut(value="execution(* *())")

            7. public void pointcut() {}

            8. }

            可以通過如下方式引用:

            1. @Before(value = "

            cut()")

            2. public void referencePointcutTest2(JoinPoint jp) {}

            除了可以在@AspectJ風格的切面內引用外,也可以在Schema風格的

            切面定義內引用,引用方式與@AspectJ完全一樣。

            到此我們切入點表達式語法示例就介紹完了,我們這些示例幾乎包含了日

            常開發中的所有情況,但當然還有更復雜的語法等等,如果以上介紹的不能滿足

            您的需要,請參考AspectJ文檔。

            由于測試代碼相當長,所以為了節約篇幅本示例代碼在

            r6. PointcutTest文件中,需要時請參考該文件。

            6.6 通知參數

            前邊章節已經介紹了聲明通知,但如果想獲取被被通知方法參數并傳遞給

            通知方法,該如何實現呢?接下來我們將介紹兩種獲取通知參數的方式。

            ?

            使用JoinPoint獲取:Spring AOP提供使用int類型獲取連接點數據,任何

            通知方法的第一個參數都可以是JoinPoint(環繞通知是ProceedingJoinPoint,JoinPoint子類),當然第

            一個參數位置也可以是Part類型,這個只返回連接點的靜態部分。

            1) JoinPoint:

            提供訪問當前被通知方法的目標對象、代理對象、方法參數等數據:

            1. package ;

            2. import Location;

            3. public interface JoinPoint {

            4. String toString(); //連接點所在位置的相關信息

            5. String toShortString(); //連接點所在位置的簡短相關信息

            6. String toLongString(); //連接點所在位置的全部相關信息

            7. Object getThis(); //返回AOP代理對象

            8. Object getTarget(); //返回目標對象

            9. Object[] getArgs(); //返回被通知方法參數列表

            10. Signature getSignature(); //返回當前連接點簽名

            11. SourceLocation getSourceLocation();//返回連接點方法所在類文件中的位置

            12. String getKind(); //連接點類型

            13. StaticPart getStaticPart(); //返回連接點靜態部分

            14. }

            2)

            ProceedingJoinPoint:用于環繞通知,使用proceed()方法來執行目標方

            法:

            1. public interface ProceedingJoinPoint extends JoinPoint {

            2. public Object proceed() throws Throwable;

            3. public Object proceed(Object[] args) throws Throwable;

            4. }

            3) Part:

            提供訪問連接點的靜態部分,如被通知方法簽

            名、連接點類型等:

            1. public interface StaticPart {

            2. Signature getSignature(); //返回當前連接點簽名

            3. String getKind(); //連接點類型

            4. int getId(); //唯一標識

            5. String toString(); //連接點所在位置的相關信息

            6. String toShortString(); //連接點所在位置的簡短相關信息

            7. String toLongString(); //連接點所在位置的全部相關信息

            8. }

            使用如下方式在通知方法上聲明,必須是在第一個參數,然后使用s

            ()就能獲取到被通知方法參數:

            1. @Before(value="execution(* sayBefore(*))")

            2. public void before(JoinPoint jp) {}

            3.

            4. @Before(value="execution(* sayBefore(*))")

            5. public void before(Part jp) {}

            ?

            自動獲取:通過切入點表達式可以將相應的參數自動傳遞給通知方法,例如前邊章節講過的

            返回值和異常是如何傳遞給通知方法的。

            在Spring AOP中,除了execution和bean指示符不能傳遞參數給通知方法,

            其他指示符都可以將匹配的相應參數或對象自動傳遞給通知方法。

            1. @Before(value="execution(* test(*)) && args(param)", argNames="param")

            2. public void before1(String param) {

            3. n("===param:" + param);

            4. }

            切入點表達式execution(* test(*)) && args(param) :

            1)首先execution(* test(*))匹配任何方法名為test,且有一個任何類型的

            參數;

            2)args(param)將首先查找通知方法上同名的參數,并在方法執行時(運行時)

            匹配傳入的參數是使用該同名參數類型,即;如果匹配將把

            該被通知參數傳遞給通知方法上同名參數。

            其他指示符(除了execution和bean指示符)都可以使用這種方式進行參數

            綁定。

            在此有一個問題,即前邊提到的類似于【3.1.2構造器注入】中的參數名注入限

            制:

            在class文件中沒生成變量調試信息是獲取不到方法參數名字的。

            所以我們可以使用策略來確定參數名:

            1. 如果我們通過“argNames”屬性指定了參數名,那么就是要我們指定的;

            查看復制到剪貼板打印

            1. @Before(value=" args(param)", argNames="param") //明確指定了

            2. public void before1(String param) {

            3. n("===param:" + param);

            4. }

            1. 如果第一個參數類型是JoinPoint、ProceedingJoinPoint或Part類型,應該從“argN

            ames”屬性省略掉該參數名(可選,寫上也對),這些類型對象會自動傳入的,但必須作為第一個參數;

            查看復制到剪貼板打印

            1. @Before(value=" args(param)", argNames="param") //明確指定了

            2. public void before1(JoinPoint jp, String param) {

            3. n("===param:" + param);

            4. }

            1. 如果“class文件中含有變量調試信息”將使用這些方法簽名中的參數名來確定參數名;

            查看復制到剪貼板打印

            1. @Before(value=" args(param)") //不需要argNames了

            2. public void before1(JoinPoint jp, String param) {

            3. n("===param:" + param);

            4. }

            1. 如果沒有“class文件中含有變量調試信息”,將嘗試自己的參數匹配算法,如果發現參數綁定有二義性將

            拋出AmbiguousBindingException異常;對于只有一個綁定變量的切入點表達式,而通知方法只接受

            一個參數,說明綁定參數是明確的,從而能配對成功。

            查看復制到剪貼板打印

            1. @Before(value=" args(param)")

            2. public void before1(JoinPoint jp, String param) {

            3. n("===param:" + param);

            4. }

            1. 以上策略失敗將拋出IllegalArgumentException。

            接下來讓我們示例一下組合情況吧:

            查看復制到剪貼板打印

            1. @Before(args(param) && target(bean) && @annotation(cure)",

            2. argNames="jp,param,bean,cure")

            3. public void before5(JoinPoint jp, String param,

            4. IPointcutService pointcutService, Secure cure) {

            5. ……

            6. }

            該示例的執行步驟如圖6-5所示。

            圖6-5 參數自動獲取流程

            除了上邊介紹的普通方式,也可以對使用命名切入點自動獲取參數:

            查看復制到剪貼板打印

            1. @Pointcut(value="args(param)", argNames="param")

            2. private void pointcut1(String param){}

            3. @Pointcut(value="@annotation(cure)", argNames="cure")

            4. private void pointcut2(Secure cure){}

            5.

            6. @Before(value = "pointcut1(param) && pointcut2(cure)",

            7. argNames="param, cure")

            8. public void before6(JoinPoint jp, String param, Secure cure) {

            9. ……

            10. }

            自此給通知傳遞參數已經介紹完了,示例代碼在

            terTest文件中。

            在Spring配置文件中,所以AOP相關定義必須放在標簽

            下,該標簽下可以有

            簽,配置順序不可變。

            ?

            ?

            ?

            :用來定義切入點,該切入點可以重用;

            :用來定義只有一個通知和一個切入點的切面;

            :用來定義切面,該切面可以包含多個切入點和通知,而且標簽內部的通知和切入點定義

            是無序的;和advisor的區別就在此,advisor只包含一個通知和一個切入點。

            Spring AOP AspectJ切入點語法詳解,execution,within,this_

            本文發布于:2024-03-20 10:26:00,感謝您對本站的認可!

            本文鏈接:http://www.newhan.cn/zhishi/a/1710901561167007.html

            版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。

            本文word下載地址:Spring AOP AspectJ切入點語法詳解,execution,within,this_.doc

            本文 PDF 下載地址:Spring AOP AspectJ切入點語法詳解,execution,within,this_.pdf

            下一篇:返回列表
            標簽:參數   類型   方法   匹配   切入點   通知
            留言與評論(共有 0 條評論)
               
            驗證碼:
            推薦文章
            排行榜
            Copyright ?2019-2022 Comsenz Inc.Powered by ? 實用文體寫作網旗下知識大全大全欄目是一個全百科類寶庫! 優秀范文|法律文書|專利查詢|
            主站蜘蛛池模板: 国产婷婷色综合av性色av| 在线看免费无码的av天堂| 精品无码久久久久成人漫画| 亚洲自偷自偷在线成人网站传媒 | 亚洲午夜亚洲精品国产成人| 成人免费乱码大片a毛片| 欧美日韩综合网| 亚洲 欧美 变态 另类 综合| 不卡一区二区国产精品| 国产91精品一区二区麻豆| 中文有无人妻vs无码人妻激烈| 亚洲另类丝袜综合网| 中文字幕国产精品日韩| 国产av一区二区三区日韩| 99久久精品国产一区二区暴力| 国产亚洲综合欧美视频| 欧美videosdesexo肥婆| 国产AV影片麻豆精品传媒| 2021国产v亚洲v天堂无码| 国产肥臀视频一区二区三区 | 99精品国产一区在线看| 奇米四色7777中文字幕| 亚洲悠悠色综合中文字幕| 国产一区二区日韩在线| 999精品全免费观看视频| 日韩在线成年视频人网站观看| 人人爽亚洲aⅴ人人爽av人人片| 国产日产欧产精品精品| 亚洲日本精品一区二区| 免费现黄频在线观看国产 | 亚洲精品电影院| 在线观看人成视频免费| 日韩国产成人精品视频| 日本三级香港三级三级人妇久| 日韩人妻无码精品久久久不卡| 亚洲成在人网站AV天堂| 久久五月丁香合缴情网| 国产在线午夜不卡精品影院| 国产suv精品一区二区四| 久久人人爽人人爽人人片DVD| 真人无码作爱免费视频|