亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java @Pointcut注解表達式案例詳解

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

1 表達式類型

標準的Aspectj Aop的pointcut的表達式類型是很豐富的,但是Spring Aop只支持其中的9種,外加Spring Aop自己擴充的一種一共是10種類型的表達式,分別如下。

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

2 使用示例

2.1 execution

execution是使用的最多的一種Pointcut表達式,表示某個方法的執(zhí)行,其標準語法如下。

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ù)類型,如“add()”表示不帶參數(shù)的add方法,“add(*)”表示帶一個任意類型的參數(shù)的add方法,“add(*,String)”則表示帶兩個參數(shù),且第二個參數(shù)是String類型的add方法;throws-pattern表示異常類型;其中以問號結束的部分都是可以省略的。

  • 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類對應對象的所有方法外部調(diào)用,而且這個對象只能是UserServiceImpl類型,不能是其子類型。
  • 2、“within(com.elim..*)”匹配com.elim包及其子包下面所有的類的所有方法的外部調(diào)用。

2.3 this

Spring Aop是基于代理的,this就表示代理對象。this類型的Pointcut表達式的語法是this(type),當生成的代理對象可以轉換為type指定的類型時則表示匹配?;贘DK接口的代理和基于CGLIB的代理生成的代理對象是不一樣的。

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

2.4 target

Spring Aop是基于代理的,target則表示被代理的目標對象。當被代理的目標對象可以被轉換為指定的類型時則表示匹配。

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

2.5 args

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

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

2.6 @target

@target匹配當被代理的目標對象對應的類型及其父類型上擁有指定的注解時。

  • 1、“@target(com.elim.spring.support.MyAnnotation)”匹配被代理的目標對象對應的類型上擁有MyAnnotation注解時。

2.7 @args

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

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

2.8 @within

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

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

2.9 @annotation

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

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

2.10 bean

bean用于匹配當調(diào)用的是指定的Spring的某個bean的方法時。

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

3 表達式組合

表達式的組合其實就是對應的表達式的邏輯運算,與、或、非。可以通過它們把多個表達式組合在一起。

  • 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表達式應用

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

@Component
@Aspect
public class MyAspect {

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

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

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

當然了,除了通過引用Pointcut定義間接的引用其對應的Pointcut表達式外,我們也可以直接使用Pointcut表達式的,如下面這個示例就直接在@Before中使用了Pointcut表達式。

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

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

相關文章

  • Java foreach相關原理及用法解析

    Java foreach相關原理及用法解析

    這篇文章主要介紹了Java foreach相關原理及用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Android中幾種圖片特效的處理的實現(xiàn)方法

    Android中幾種圖片特效的處理的實現(xiàn)方法

    這篇文章主要介紹了 Android中幾種圖片特效的處理的實現(xiàn)方法的相關資料,這里有放大縮小圖片,獲得圓角圖片,獲得帶倒影圖片的幾種方法,需要的朋友可以參考下
    2017-08-08
  • SpringData關鍵字查詢實現(xiàn)方法詳解

    SpringData關鍵字查詢實現(xiàn)方法詳解

    這篇文章主要介紹了SpringData關鍵字查詢實現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Java Web 簡單的分頁顯示實例代碼

    Java Web 簡單的分頁顯示實例代碼

    這篇文章主要介紹了Java Web 簡單的分頁顯示實例代碼的相關資料,本文通過,計算總的頁數(shù)和查詢指定頁數(shù)據(jù)兩個方法實現(xiàn)分頁效果,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • 探索Java分布式限流技術

    探索Java分布式限流技術

    探索Java分布式限流技術,讓你的系統(tǒng)遠離流量過載的煩惱,本指南將帶你了解如何使用Java實現(xiàn)高效的限流策略,幫助你輕松應對高并發(fā)場景,讓我們一起開啟這段精彩的技術之旅,打造更加穩(wěn)定可靠的系統(tǒng),需要的朋友可以參考下
    2024-03-03
  • 探索HttpClient中的close方法及其對連接的影響

    探索HttpClient中的close方法及其對連接的影響

    這篇文章主要為大家介紹了HttpClient中的close方法及其對連接的影響探索分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 淺談JVM垃圾回收之哪些對象可以被回收

    淺談JVM垃圾回收之哪些對象可以被回收

    這篇文章主要介紹了JVM垃圾回收之哪些對象可以被回收,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • IDEA搭建SpringBoot離線工程的方法

    IDEA搭建SpringBoot離線工程的方法

    這篇文章主要介紹了IDEA搭建SpringBoot離線工程的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • 在Java中使用基本的正則表達式

    在Java中使用基本的正則表達式

    這篇文章主要介紹了在Java中使用基本的正則表達式,本文通過簡要的案例,說明了很多場景下的正則表達式的用法,列出了正則表達式匹配規(guī)則的表格,需要的朋友可以參考下
    2021-07-07
  • Spring Boot2如何構建可部署的war包

    Spring Boot2如何構建可部署的war包

    這篇文章主要介紹了Spring Boot2如何構建可部署的war包,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11

最新評論