如何實現(xiàn)SpringAOP切點函數(shù)

這篇文章主要為大家展示了如何實現(xiàn)SpringAOP切點函數(shù),內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名注冊雅安服務器托管、營銷軟件、網站建設、東勝網站維護、網站推廣。

一:在函數(shù)入參中使用通配符

@AspectJ支持3種通配符

* :匹配任意字符,但它只能匹配上下文中的一個元素.

.. :匹配任意字符,可以匹配上下文中多個元素,但在表示類時,必須和*聯(lián)合使用,而在表示入參時則單獨使用

+ :表示按類型匹配指定類的所有類,必須跟在類名后面,如com.smart.Car+ ;繼承或擴展指定類的所有類,同時還包括指定類本身.

@AspectJ函數(shù)按其是否支持通配符及支持的程度,可以分為以下3類.

1):支持所有的通配符:execution(),within()

2):僅支持“+”通配符:args(),this(),target()

3):不支持通配符:@args(),within(),target();@annotation()

此外,args(),this(),target(),@args(),@within(),@target()和@annotation()這7個函數(shù)除了可以指定類名外,也可以指定變量名,并將目標對象中的變量綁定到增強的方法中.

二:切點函數(shù)詳解

[1]:@annotation()

@annotation()表示標注了某個注解的所有方法.

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()是最常用的切點函數(shù),其語法如下:

execution(<修飾符模式>&#63;<返回類型模式><方法名模式>(<參數(shù)模式>) <異常模式>&#63;)

除了返回類型模式,方法名模式,參數(shù)模式外,其他項都是可選的.

(1):通過方法簽名定義切點

execution(public * *(..)):匹配所有目標類的public方法,第一個*代表返回類型,第二個*代表方法名,而..代表任意入參的方法.

execution(* *To(..)):匹配所有以To為后綴的方法,第一個*代表返回類型,而*To代表任意以To為后綴的方法.

(2):通過類定義切點

execution(* com.springboot.Waiter.*(..)):匹配Waiter接口的所有方法,第一個*代表返回任意類型;com.springboot.Waiter.*(..)代表Waiter接口的所有方法,

(3):通過類包定義切點

在類名模式串中,“.*”表示包下所有的類,而“..*”表示包,子孫包下的所有類.

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):通過方法入參定義切點:

切點表達式中的方法入參部分比較復雜,可以使用“*”,“..”通配符.其中“*”表示任意類型的參數(shù);而“..”表示任意類型的參數(shù)且參數(shù)個數(shù)不限.

execution(* joke(String,int)):匹配joke(String str,int d)方法.

execution(* joke(String,*):匹配目標類中的joke(),但該方法的第一個入參為String類型,第二個入參可以是任意類型.

execution(* joke(String,..)):匹配目標類中的joke(),該方法的第一個入參為String類型,后面可以有任意個入參,且入參類型不受限制.

execution(* joke(Object+)):匹配目標類中的joke(),方法擁有一個入參,且入參是Object類型或該類的子類.

[3]:args()和@args()

args():該函數(shù)接收一個類名,表示目標類方法入參對象是指定類(包含字類)時,切點匹配

1):args(com.smart.Waiter)表示運行時入參是Waiter類型的方法, 其等價于execution(* *(com.smart.Waiter+))當然也等價于args(com.smart.Waiter+).

2):@args() 太啰嗦,不打字了...

[4]:within()

通過類匹配模式串聲明切點,within()函數(shù)定義的連接點是針對目標類而言的,而非針對運行期對象的類型而言,這一點和execution()是相同的.但和execution()函數(shù)不同的是,within()所指定的連接點的最小范圍只能是類,二execution()所指定的連接點可以大到包,小到方法入參.所以從某種意義上說,execution()函數(shù)的功能涵蓋了within()函數(shù)的功能.within()函數(shù)語法如下:

within(<類匹配模式>)

  •   within(com.smart.NativeWaiter): 匹配目標類NativeWaiter的所有方法.
  •   within(com.smart.*):  匹配com.smart包中的所有類,但不包括子孫包,所以com.smart.service包中類的方法不匹配這個切點
  •   within(co.smart..*):  匹配com.smart包及子孫包中的類,所以com.smart.service,com.smart.dao,com.smart.service.forum等包中的所有類都匹配這個切點.

[5]@within() ,@target()

[6]target(),this()

以上就是關于如何實現(xiàn)SpringAOP切點函數(shù)的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。

分享題目:如何實現(xiàn)SpringAOP切點函數(shù)
當前網址:http://muchs.cn/article38/jpgdsp.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供App設計、手機網站建設、做網站、移動網站建設、小程序開發(fā)

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

商城網站建設