SpringAOP切點(diǎn)函數(shù)實(shí)現(xiàn)原理詳解
一:在函數(shù)入?yún)⒅惺褂猛ㄅ浞?/strong>
@AspectJ支持3種通配符
* :匹配任意字符,但它只能匹配上下文中的一個(gè)元素.
.. :匹配任意字符,可以匹配上下文中多個(gè)元素,但在表示類時(shí),必須和*聯(lián)合使用,而在表示入?yún)r(shí)則單獨(dú)使用
+ :表示按類型匹配指定類的所有類,必須跟在類名后面,如com.smart.Car+ ;繼承或擴(kuò)展指定類的所有類,同時(shí)還包括指定類本身.
@AspectJ函數(shù)按其是否支持通配符及支持的程度,可以分為以下3類.
1):支持所有的通配符:execution(),within()
2):僅支持“+”通配符:args(),this(),target()
3):不支持通配符:@args(),within(),target();@annotation()
此外,args(),this(),target(),@args(),@within(),@target()和@annotation()這7個(gè)函數(shù)除了可以指定類名外,也可以指定變量名,并將目標(biāo)對(duì)象中的變量綁定到增強(qiáng)的方法中.
二:切點(diǎn)函數(shù)詳解
[1]:@annotation()
@annotation()表示標(biāo)注了某個(gè)注解的所有方法.
eg:
package com.springboot.test; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Aspect @Component public class TestAspect { @AfterReturning("@annotation(com.springboot.anno.NeedTest)") public void needTestFun() { System.out.println("needTestFun() executed!"); } }
[2]:execution()
execution()是最常用的切點(diǎn)函數(shù),其語法如下:
execution(<修飾符模式>?<返回類型模式><方法名模式>(<參數(shù)模式>) <異常模式>?)
除了返回類型模式,方法名模式,參數(shù)模式外,其他項(xiàng)都是可選的.
(1):通過方法簽名定義切點(diǎn)
execution(public * *(..)):匹配所有目標(biāo)類的public方法,第一個(gè)*代表返回類型,第二個(gè)*代表方法名,而..代表任意入?yún)⒌姆椒?
execution(* *To(..)):匹配所有以To為后綴的方法,第一個(gè)*代表返回類型,而*To代表任意以To為后綴的方法.
(2):通過類定義切點(diǎn)
execution(* com.springboot.Waiter.*(..)):匹配Waiter接口的所有方法,第一個(gè)*代表返回任意類型;com.springboot.Waiter.*(..)代表Waiter接口的所有方法,
(3):通過類包定義切點(diǎn)
在類名模式串中,“.*”表示包下所有的類,而“..*”表示包,子孫包下的所有類.
execution(* com.smart.*(..)):匹配com.smart包下的所有類的所有方法.
execution(* com.smart..*(..)):匹配com.smart包.子孫包下所有的類的所有方法.
execution(* com..*.*Dao.find*(..)):匹配包名前綴為com的任何包下類名后綴為Dao的方法,方法名必須以find為前綴.如:com.smart.UserDao#findByUserId(), com.smart.dao.ForumDao#findById()等.
(4):通過方法入?yún)⒍x切點(diǎn):
切點(diǎn)表達(dá)式中的方法入?yún)⒉糠直容^復(fù)雜,可以使用“*”,“..”通配符.其中“*”表示任意類型的參數(shù);而“..”表示任意類型的參數(shù)且參數(shù)個(gè)數(shù)不限.
execution(* joke(String,int)):匹配joke(String str,int d)方法.
execution(* joke(String,*):匹配目標(biāo)類中的joke(),但該方法的第一個(gè)入?yún)镾tring類型,第二個(gè)入?yún)⒖梢允侨我忸愋?
execution(* joke(String,..)):匹配目標(biāo)類中的joke(),該方法的第一個(gè)入?yún)镾tring類型,后面可以有任意個(gè)入?yún)?且入?yún)㈩愋筒皇芟拗?
execution(* joke(Object+)):匹配目標(biāo)類中的joke(),方法擁有一個(gè)入?yún)?且入?yún)⑹荗bject類型或該類的子類.
[3]:args()和@args()
args():該函數(shù)接收一個(gè)類名,表示目標(biāo)類方法入?yún)?duì)象是指定類(包含字類)時(shí),切點(diǎn)匹配
1):args(com.smart.Waiter)表示運(yùn)行時(shí)入?yún)⑹荳aiter類型的方法, 其等價(jià)于execution(* *(com.smart.Waiter+))當(dāng)然也等價(jià)于args(com.smart.Waiter+).
2):@args() 太啰嗦,不打字了...
[4]:within()
通過類匹配模式串聲明切點(diǎn),within()函數(shù)定義的連接點(diǎn)是針對(duì)目標(biāo)類而言的,而非針對(duì)運(yùn)行期對(duì)象的類型而言,這一點(diǎn)和execution()是相同的.但和execution()函數(shù)不同的是,within()所指定的連接點(diǎn)的最小范圍只能是類,二execution()所指定的連接點(diǎn)可以大到包,小到方法入?yún)?所以從某種意義上說,execution()函數(shù)的功能涵蓋了within()函數(shù)的功能.within()函數(shù)語法如下:
within(<類匹配模式>)
- within(com.smart.NativeWaiter): 匹配目標(biāo)類NativeWaiter的所有方法.
- within(com.smart.*): 匹配com.smart包中的所有類,但不包括子孫包,所以com.smart.service包中類的方法不匹配這個(gè)切點(diǎn)
- within(co.smart..*): 匹配com.smart包及子孫包中的類,所以com.smart.service,com.smart.dao,com.smart.service.forum等包中的所有類都匹配這個(gè)切點(diǎn).
[5]@within() ,@target()
[6]target(),this()
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合Mybatis注解開發(fā)的實(shí)現(xiàn)代碼
這篇文章主要介紹了SpringBoot整合Mybatis注解開發(fā)的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11SpringMVC結(jié)合天氣api實(shí)現(xiàn)天氣查詢
這篇文章主要為大家詳細(xì)介紹了SpringMVC結(jié)合天氣api實(shí)現(xiàn)天氣查詢,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Java中正則表達(dá)式的語法以及matches方法的使用方法
正則表達(dá)式(Regular Expression)是一門簡單語言的語法規(guī)范,是強(qiáng)大、便捷、高效的文本處理工具,這篇文章主要給大家介紹了關(guān)于Java中正則表達(dá)式的語法以及matches方法的使用方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05mybatis類型處理器JSR310標(biāo)準(zhǔn)詳解
這篇文章主要介紹了mybatis類型處理器JSR310標(biāo)準(zhǔn)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Spring Cloud Config 使用本地配置文件方式
這篇文章主要介紹了Spring Cloud Config 使用本地配置文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringMVC結(jié)合模板模式實(shí)現(xiàn)MyBatisPlus傳遞嵌套JSON數(shù)據(jù)
我們經(jīng)常會(huì)遇到需要傳遞對(duì)象的場(chǎng)景,有時(shí)候,我們需要將一個(gè)對(duì)象的數(shù)據(jù)傳遞給另一個(gè)對(duì)象進(jìn)行處理,但是又不希望直接暴露對(duì)象的內(nèi)部結(jié)構(gòu)和實(shí)現(xiàn)細(xì)節(jié),所以本文給大家介紹了SpringMVC結(jié)合模板模式實(shí)現(xiàn)MyBatisPlus傳遞嵌套JSON數(shù)據(jù),需要的朋友可以參考下2024-03-03Java加密解密工具(適用于JavaSE/JavaEE/Android)
這篇文章主要介紹了Java加密解密工具,適用于JavaSE/JavaEE/Android,感興趣的小伙伴們可以參考一下2016-04-04通過openOffice將office文件轉(zhuǎn)成pdf
這篇文章主要介紹了通過openOffice將office文件轉(zhuǎn)成pdf,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11