最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java @Pointcut注解表達(dá)式案例詳解

 更新時(shí)間:2021年09月03日 08:42:19   作者:晚風(fēng)丶寒雨  
這篇文章主要介紹了Java @Pointcut注解表達(dá)式案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

1 表達(dá)式類型

標(biāo)準(zhǔn)的Aspectj Aop的pointcut的表達(dá)式類型是很豐富的,但是Spring Aop只支持其中的9種,外加Spring Aop自己擴(kuò)充的一種一共是10種類型的表達(dá)式,分別如下。

  • execution:一般用于指定方法的執(zhí)行,用的最多。
  • within:指定某些類型的全部方法執(zhí)行,也可用來指定一個(gè)包。
  • this:Spring Aop是基于代理的,生成的bean也是一個(gè)代理對(duì)象,this就是這個(gè)代理對(duì)象,當(dāng)這個(gè)對(duì)象可以轉(zhuǎn)換為指定的類型時(shí),對(duì)應(yīng)的切入點(diǎn)就是它了,Spring Aop將生效。
  • target:當(dāng)被代理的對(duì)象可以轉(zhuǎn)換為指定的類型時(shí),對(duì)應(yīng)的切入點(diǎn)就是它了,Spring Aop將生效。
  • args:當(dāng)執(zhí)行的方法的參數(shù)是指定類型時(shí)生效。
  • @target:當(dāng)代理的目標(biāo)對(duì)象上擁有指定的注解時(shí)生效。
  • @args:當(dāng)執(zhí)行的方法參數(shù)類型上擁有指定的注解時(shí)生效。
  • @within:與@target類似,看官方文檔和網(wǎng)上的說法都是@within只需要目標(biāo)對(duì)象的類或者父類上有指定的注解,則@within會(huì)生效,而@target則是必須是目標(biāo)對(duì)象的類上有指定的注解。而根據(jù)筆者的測(cè)試這兩者都是只要目標(biāo)類或父類上有指定的注解即可。
  • @annotation:當(dāng)執(zhí)行的方法上擁有指定的注解時(shí)生效。
  • bean:當(dāng)調(diào)用的方法是指定的bean的方法時(shí)生效。

2 使用示例

2.1 execution

execution是使用的最多的一種Pointcut表達(dá)式,表示某個(gè)方法的執(zhí)行,其標(biāo)準(zhǔn)語法如下。

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? 
	name-pattern(param-pattern) throws-pattern?)

modifiers-pattern表示方法的訪問類型,public等;ret-type-pattern表示方法的返回值類型,如String表示返回類型是String,“*”表示所有的返回類型;declaring-type-pattern表示方法的聲明類,如“com.elim..*”表示com.elim包及其子包下面的所有類型;name-pattern表示方法的名稱,如“add*”表示所有以add開頭的方法名;param-pattern表示方法參數(shù)的類型,name-pattern(param-pattern)其實(shí)是一起的表示的方法集對(duì)應(yīng)的參數(shù)類型,如“add()”表示不帶參數(shù)的add方法,“add(*)”表示帶一個(gè)任意類型的參數(shù)的add方法,“add(*,String)”則表示帶兩個(gè)參數(shù),且第二個(gè)參數(shù)是String類型的add方法;throws-pattern表示異常類型;其中以問號(hào)結(jié)束的部分都是可以省略的。

  • 1、“execution(* add())”匹配所有的不帶參數(shù)的add()方法。
  • 2、“execution(public * com.elim..*.add*(..))”匹配所有com.elim包及其子包下所有類的以add開頭的所有public方法。
  • 3、“execution(* *(..) throws Exception)”匹配所有拋出Exception的方法。

2.2 within

within是用來指定類型的,指定類型中的所有方法將被攔截。

  • 1、“within(com.elim.spring.aop.service.UserServiceImpl)”匹配UserServiceImpl類對(duì)應(yīng)對(duì)象的所有方法外部調(diào)用,而且這個(gè)對(duì)象只能是UserServiceImpl類型,不能是其子類型。
  • 2、“within(com.elim..*)”匹配com.elim包及其子包下面所有的類的所有方法的外部調(diào)用。

2.3 this

Spring Aop是基于代理的,this就表示代理對(duì)象。this類型的Pointcut表達(dá)式的語法是this(type),當(dāng)生成的代理對(duì)象可以轉(zhuǎn)換為type指定的類型時(shí)則表示匹配。基于JDK接口的代理和基于CGLIB的代理生成的代理對(duì)象是不一樣的。

  • 1、“this(com.elim.spring.aop.service.IUserService)”匹配生成的代理對(duì)象是IUserService類型的所有方法的外部調(diào)用。

2.4 target

Spring Aop是基于代理的,target則表示被代理的目標(biāo)對(duì)象。當(dāng)被代理的目標(biāo)對(duì)象可以被轉(zhuǎn)換為指定的類型時(shí)則表示匹配。

  • 1、“target(com.elim.spring.aop.service.IUserService)”則匹配所有被代理的目標(biāo)對(duì)象能夠轉(zhuǎn)換為IUserService類型的所有方法的外部調(diào)用。

2.5 args

args用來匹配方法參數(shù)的。

  • 1、“args()”匹配任何不帶參數(shù)的方法。
  • 2、“args(java.lang.String)”匹配任何只帶一個(gè)參數(shù),而且這個(gè)參數(shù)的類型是String的方法。
  • 3、“args(..)”帶任意參數(shù)的方法。
  • 4、“args(java.lang.String,..)”匹配帶任意個(gè)參數(shù),但是第一個(gè)參數(shù)的類型是String的方法。
  • 5、“args(..,java.lang.String)”匹配帶任意個(gè)參數(shù),但是最后一個(gè)參數(shù)的類型是String的方法。

2.6 @target

@target匹配當(dāng)被代理的目標(biāo)對(duì)象對(duì)應(yīng)的類型及其父類型上擁有指定的注解時(shí)。

  • 1、“@target(com.elim.spring.support.MyAnnotation)”匹配被代理的目標(biāo)對(duì)象對(duì)應(yīng)的類型上擁有MyAnnotation注解時(shí)。

2.7 @args

@args匹配被調(diào)用的方法上含有參數(shù),且對(duì)應(yīng)的參數(shù)類型上擁有指定的注解的情況。

  • 1、“@args(com.elim.spring.support.MyAnnotation)”匹配方法參數(shù)類型上擁有MyAnnotation注解的方法調(diào)用。如我們有一個(gè)方法add(MyParam param)接收一個(gè)MyParam類型的參數(shù),而MyParam這個(gè)類是擁有注解MyAnnotation的,則它可以被Pointcut表達(dá)式“@args(com.elim.spring.support.MyAnnotation)”匹配上。

2.8 @within

@within用于匹配被代理的目標(biāo)對(duì)象對(duì)應(yīng)的類型或其父類型擁有指定的注解的情況,但只有在調(diào)用擁有指定注解的類上的方法時(shí)才匹配。

  • 1、“@within(com.elim.spring.support.MyAnnotation)”匹配被調(diào)用的方法聲明的類上擁有MyAnnotation注解的情況。比如有一個(gè)ClassA上使用了注解MyAnnotation標(biāo)注,并且定義了一個(gè)方法a(),那么在調(diào)用ClassA.a()方法時(shí)將匹配該P(yáng)ointcut;如果有一個(gè)ClassB上沒有MyAnnotation注解,但是它繼承自ClassA,同時(shí)它上面定義了一個(gè)方法b(),那么在調(diào)用ClassB().b()方法時(shí)不會(huì)匹配該P(yáng)ointcut,但是在調(diào)用ClassB().a()時(shí)將匹配該方法調(diào)用,因?yàn)閍()是定義在父類型ClassA上的,且ClassA上使用了MyAnnotation注解。但是如果子類ClassB覆寫了父類ClassA的a()方法,則調(diào)用ClassB.a()方法時(shí)也不匹配該P(yáng)ointcut。

2.9 @annotation

@annotation用于匹配方法上擁有指定注解的情況。

  • 1、“@annotation(com.elim.spring.support.MyAnnotation)”匹配所有的方法上擁有MyAnnotation注解的方法外部調(diào)用。

2.10 bean

bean用于匹配當(dāng)調(diào)用的是指定的Spring的某個(gè)bean的方法時(shí)。

  • 1、“bean(abc)”匹配Spring Bean容器中id或name為abc的bean的方法調(diào)用。
  • 2、“bean(user*)”匹配所有id或name為以u(píng)ser開頭的bean的方法調(diào)用。

3 表達(dá)式組合

表達(dá)式的組合其實(shí)就是對(duì)應(yīng)的表達(dá)式的邏輯運(yùn)算,與、或、非??梢酝ㄟ^它們把多個(gè)表達(dá)式組合在一起。

  • 1、“bean(userService) && args()”匹配id或name為userService的bean的所有無參方法。
  • 2、“bean(userService) || @annotation(MyAnnotation)”匹配id或name為userService的bean的方法調(diào)用,或者是方法上使用了MyAnnotation注解的方法調(diào)用。
  • 3、“bean(userService) && !args()”匹配id或name為userService的bean的所有有參方法調(diào)用。

4 基于Aspectj注解的Pointcut表達(dá)式應(yīng)用

在使用基于Aspectj注解的Spring Aop時(shí),我們可以把通過@Pointcut注解定義Pointcut,指定其表達(dá)式,然后在需要使用Pointcut表達(dá)式的時(shí)候直接指定Pointcut。

@Component
@Aspect
public class MyAspect {

	@Pointcut("execution(* add(..))")
	private void beforeAdd() {}
	
	@Before("beforeAdd()")
	public void before() {
		System.out.println("-----------before-----------");
	}
	
}

上面的代碼中我們就是在@Before()中直接指定使用當(dāng)前類定義的beforeAdd()方法對(duì)應(yīng)的Pointcut的表達(dá)式,如果我們需要指定的Pointcut定義不是在當(dāng)前類中的,我們需要加上類名稱,如下面這個(gè)示例中引用的就是定義在MyService中的add()方法上的Pointcut的表達(dá)式。

@Before("com.elim.spring.aop.service.MyService.add()")
public void before2() {
	System.out.println("-----------before2-----------");
}

當(dāng)然了,除了通過引用Pointcut定義間接的引用其對(duì)應(yīng)的Pointcut表達(dá)式外,我們也可以直接使用Pointcut表達(dá)式的,如下面這個(gè)示例就直接在@Before中使用了Pointcut表達(dá)式。

/**
 * 所有的add方法的外部執(zhí)行時(shí)
 */
@Before("execution(* add())")
public void beforeExecution() {
	System.out.println("-------------before execution---------------");
}

到此這篇關(guān)于Java @Pointcut注解表達(dá)式案例詳解的文章就介紹到這了,更多相關(guān)Java @Pointcut注解表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot預(yù)加載與懶加載實(shí)現(xiàn)方法超詳細(xì)講解

    SpringBoot預(yù)加載與懶加載實(shí)現(xiàn)方法超詳細(xì)講解

    Spring一直被詬病啟動(dòng)時(shí)間慢,可Spring/SpringBoot是輕量級(jí)的框架。因?yàn)楫?dāng)Spring項(xiàng)目越來越大的時(shí)候,在啟動(dòng)時(shí)加載和初始化Bean就會(huì)變得越來越慢,很多時(shí)候我們?cè)趩?dòng)時(shí)并不需要加載全部的Bean,在調(diào)用時(shí)再加載就行,那這就需要預(yù)加載與懶加載的功能了
    2022-11-11
  • Java后端WebSocket的Tomcat實(shí)現(xiàn)

    Java后端WebSocket的Tomcat實(shí)現(xiàn)

    這篇文章主要介紹了Java后端WebSocket的Tomcat實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • 解析Runtime中shutdown hook的使用詳解

    解析Runtime中shutdown hook的使用詳解

    本篇文章是對(duì)解析Runtime中shutdown hook的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Java的位圖和布隆過濾器深入詳細(xì)講解

    Java的位圖和布隆過濾器深入詳細(xì)講解

    這篇文章主要介紹了Java的位圖和布隆過濾器,在學(xué)習(xí)之前的數(shù)據(jù)結(jié)構(gòu)的時(shí)候,我們使用的數(shù)據(jù)量都不是很大,但是在生活中,我們常常面臨著要處理大量數(shù)據(jù)結(jié)果并得出最終結(jié)果,那么有沒有什么數(shù)據(jù)結(jié)構(gòu)可以幫助我們實(shí)現(xiàn)這樣的功能呢,想要繼續(xù)了解的朋友可以參考下
    2024-10-10
  • SpringMVC存取Session的兩種方法

    SpringMVC存取Session的兩種方法

    Spring MVC是個(gè)非常優(yōu)秀的框架,本篇文章主要介紹了SpringMVC存取Session的兩種方法,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-01-01
  • Spring Boot學(xué)習(xí)入門之表單驗(yàn)證

    Spring Boot學(xué)習(xí)入門之表單驗(yàn)證

    表單驗(yàn)證主要是用來防范小白搞亂網(wǎng)站和一些低級(jí)的黑客技術(shù)。Spring Boot可以使用注解 @Valid 進(jìn)行表單驗(yàn)證。下面這篇文章主要給大家介紹了關(guān)于Spring Boot學(xué)習(xí)入門之表單驗(yàn)證的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • 關(guān)于使用swagger整合springMVC的方法

    關(guān)于使用swagger整合springMVC的方法

    在平時(shí)開發(fā)寫接口文檔的工作時(shí),一般都是word文檔,帶來書寫麻煩、維護(hù)麻煩的問題,比如改了源代碼忘了更新文檔、解釋不明確帶來歧義、無法在線嘗試等等,swagger可以有效解決這類問題,需要的朋友可以參考下
    2023-04-04
  • java進(jìn)階解析Springboot上傳excel存入數(shù)據(jù)庫步驟

    java進(jìn)階解析Springboot上傳excel存入數(shù)據(jù)庫步驟

    項(xiàng)目需要,寫了一個(gè),批量導(dǎo)入的接口。因?yàn)樾枰褂胑xcel去批量導(dǎo)入數(shù)據(jù),所以寫了一個(gè)例子,經(jīng)過測(cè)試已經(jīng)可以用于實(shí)際開發(fā),這里記錄一下
    2021-09-09
  • Springboot項(xiàng)目打包如何將依賴的jar包輸出到指定目錄

    Springboot項(xiàng)目打包如何將依賴的jar包輸出到指定目錄

    公司要對(duì)springboot項(xiàng)目依賴的jar包進(jìn)行升級(jí),但是遇到一個(gè)問題,項(xiàng)目打包之后,沒辦法看到他里面依賴的jar包,版本到底是不是升上去了,沒辦法看到,下面通過本文給大家分享Springboot項(xiàng)目打包如何將依賴的jar包輸出到指定目錄,感興趣的朋友一起看看吧
    2024-05-05
  • servlet過濾器(Filter)詳解(九)

    servlet過濾器(Filter)詳解(九)

    這篇文章主要為大家詳細(xì)介紹了servlet過濾器Filter的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09

最新評(píng)論

丰县| 彭州市| 聂荣县| 彭水| 江都市| 台中市| 武冈市| 镇雄县| 内江市| 洞口县| 安新县| 梅河口市| 日照市| 开封市| 平阴县| 永丰县| 龙海市| 沈阳市| 汉沽区| 延边| 延安市| 南川市| 东阳市| 温泉县| 宜宾县| 金秀| 诸城市| 襄垣县| 开阳县| 新余市| 浮山县| 遵义县| 久治县| 辉县市| 巴马| 行唐县| 慈利县| 兴城市| 从江县| 庆城县| 朝阳市|