一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringAop切入點execution表達式的深入講解

SpringAop切入點execution表達式的深入講解

2021-11-23 14:40Thinkingca Java教程

Spring AOP 可能會經常使用 execution切入點指示符,下面這篇文章主要給大家介紹了關于SpringAop切入點execution表達式的相關資料,需要的朋友可以參考下

一、Aspect切入點語法定義

在使用spring框架配置AOP的時候,不管是通過XML配置文件形式,還是注解的方式都需要定義pointcut(切入點),pointcut稱之為切入點。

例如 :

定義切入點表達式  :   

?
1
execution (* com.sample.service.impl..*.*(..))

上面的execution()是最常用的切點函數,其語法如下所示:

整個表達式可以分為五個部分

 1、execution():表達式主體。

 2、第一個*號:表示返回類型,*號表示所有的類型。

 3、包名:表示需要攔截的包名,后面的兩個句點分別表示當前包和當前包的所有子包,com.sample.service.impl包、子孫包下所有類的方法。

 4、第二個*號:表示類名,*號表示所有的類。

 5、*(..) :第三個星號表示方法名,*號表示所有的方法,后面括弧里面表示方法的參數,兩個句點表示任何參數。

下面給出一些常見切入點表達式的例子: 借鑒(https://smallbee.iteye.com/blog/2213078)

任意公共方法的執行:

?
1
execution(public * *(..))    : 表明任何返回類型、類名和參數的任何公共方法都將被通知。

任何一個以"set"開始的方法的執行:

?
1
execution(* set*(..))

AccountService接口的任意方法的執行:

?
1
execution(* com.xyz.service.AccountService.*(..))

定義在service包里的任意方法的執行:

?
1
execution(* com.xyz.service.*.*(..))

定義在service包或者子包里的任意類的任意方法的執行:

?
1
execution(* com.xyz.service..*.*(..))

二、如何定義多個切入點,在多個表達式之間如何表示   

  • 使用 ||,   or表示 或
  • 使用 &&,and表示 與
  • 使用not,!表示 非 

三、execution表達式

1、匹配指定包下所有類方法 :

?
1
execution(* com.baidu.dao.*(..)) 不包含子包

2.   匹配指定包以及及指定包下面的子包所有類 :

?
1
execution(* com.baidu.dao..*(..))  ..*表示當前包、子孫包下所有類

3、匹配指定類所有方法 :

?
1
execution(* com.baidu.service.UserService.*(..))

4、匹配實現特定接口所有類方法 :

?
1
execution(* com.baidu.dao.GenericDAO+.*(..))

5、匹配所有save開頭的方法 :

?
1
execution(* save*(..))

另外,簽名可分為類型簽名和方法簽名,下面介紹兩種類型 的區別,參考自: https://www.jianshu.com/p/1ff6c1edbb7b

四、類型簽名表達式

為了根據類型(比如接口、類名或者包名過濾方法),SpringAOP提供了Within關鍵字。類型簽名模式如下,其中可以使用package name或者class name替換type name。

?
1
Within(<type name>)

接下來列舉一些類型簽名用法的示例:

  • within(net.yangki..*):該通知將匹配net.yangki包及其子包中所有類中的所有方法。
  • within(net.yangki.spring.demo.MyService):該通知將匹配MyService類中的所有方法。
  • within(MyServiceInterface+):該通知將匹配所有實現了MyServiceInterface接口的類的所有方法。
  • within(net.yangki.spring.demo.MyBaseService+):該通知將匹配MyBaseService類以及其子類的所有方法。

五、方法簽名表達式

如果想根據方法簽名進行過濾,可以使用關鍵字execution。模式如下:

?
1
execution(<scope><return-type><fully-qualified-class-name>.*(parameters))

此時,對于與給定的作用域、返回類型、完全限定類名以及參數相匹配的方法,都會應用指定的通知。方法的作用域可以是公共的、保護的或者私有的。如果不想使用參數過濾,可以指定兩個點..,以表明方法可以接受任何數量和任何類型的參數。下面對方法簽名的示例進行了簡單的概述:

  • execute(* net.yangki.soring.demo.MyBean.*(..)):該通知將匹配MyBean中的所有方法。
  • execute(public * net.yangki.spring.demo.MyBean.*(..)):該通知將匹配MyBean中的所有公共方法。
  • execute(public String net.yangki.spring.demo.MyBean.*(..)):該通知將匹配MyBean中的所有返回值為String類型的公共方法。
  • execute(public * net.yangki.spring.demo.MyBean.*(long,..)):該通知將匹配MyBean第一個參數被定義為long的所有公共方法。

六、其他替代的切入點指示符

該部分將舉例SpringAOP所支持的指示符。AOP僅支持在其他AOP項目中可用的指示符的一個子集。

  • bean(* Service):根據名稱使用關鍵字bean進行過濾。該切入點表達式將與名稱中帶有后綴Service的Bean相匹配。
  • @annotation(net.yangki.spring.demo.MarkerMethodAnnotation):根據所應用的注解對方法進行過濾。該切入點表達式表明使用了MarkerMethodAnnotation注解的方法將被通知。
  • within(net.yangki.spring.demo.MarkerAnnotation):當帶有關鍵字within的切入點表達式與一個包、類或者接口相匹配時,可以根據類所使用的注解限制對類的過濾。此時,使用了MarkerMethodAnnotation注解的類將被@within關鍵字通知。
  • This(net.yangki.spring.demo.MarkerInterface):該切入點表達式將對任何實現了MarkerInterface接口的代理對象的方法進行過濾。

七、通配符

在定義表達式時,還可以使用通配符。比如*、..或者+。如下表

通配符 定義
.. 該通配符匹配方法定義中的任何數量的參數,此外還匹配類定義中任何數量的包
+ 該通配符匹配給定類的任何子類
* 該通配符匹配任何數量的字符

總結

到此這篇關于SpringAop切入點execution表達式的文章就介紹到這了,更多相關SpringAop切入點execution表達式內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/Thinkingcao/article/details/84872610

延伸 · 閱讀

精彩推薦
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
主站蜘蛛池模板: 好吊色视频988gao在线观看 | 小小水蜜桃3视频在线观看 小鸟酱喷水 | 国产精品国语自产拍在线观看 | 成年人黄色录像 | 国产精品久久香蕉免费播放 | 国产一卡二卡3卡4卡四卡在线 | fulao在线观看的 | 亚洲天堂2015 | 东北疯狂xxxxbbbb中国 | 亚洲热影院 | 欧美性欲 | 四虎免费在线观看视频 | 公妇乱淫 | 欧美日韩一二三区免费视频观看 | 免费特黄一级欧美大片 | 日本阿v精品视频在线观看 日本xxx片免费高清在线 | 百合互慰吃奶互揉漫画 | 久久久无码精品亚洲欧美 | 亚洲精品国产在线 | 皇上好大好硬好涨好深好爽 | 天天综合色天天综合色sb | 暖暖中国免费观看高清完整版 | 奇米影视7777 | 成人啪精品视频免费网站 | 欧美综合色网 | 亚洲国产精品第一区二区三区 | a天堂中文在线 | 精品国产一区二区在线观看 | 国产精品第 | 97午夜 | 日本美女动态图片 | 草久久网| 污到你怀疑人生 | 久草在线福利视频在线播放 | 91免费在线| 日韩色综合| 精品国产乱码久久久久久软件 | 国内精品视频九九九九 | 爱情岛永久成人免费网站 | 亚欧视频在线观看 | 午夜小视频网站 |