首先說一下這個AspectJ出現的原因,在AspectJ之前我們可以使用SpringAOP來實作功能如下圖所示,但是我們也面臨着一些缺陷,就是它注冊代理元件、取出方法的指定并不那麼靈活,而AspectJ在注冊過程中不需要一一指定委托類元件,取出過程中也不需要指定元件id,接下來我們詳細介紹下它的使用方法
目錄
Pointcut
切入點表達式
execution
@annotation
Pointcut
切入點是指指定增強的方法(必須是容器中的元件方法)
切入點的表達式需要在配置檔案中配置
标簽<aop:pointcut id expression/>,作為<aop:config>的子标簽
切入點表達式
execution
execution(修飾符 傳回值 包名、類名、方法名(形參))
判斷方法(容器中的元件的方法)是否滿足表達式,如果滿足就增強
- 能否省略
- 能否通配
- 特殊用法
首先我們來介紹下使用規則
修飾符可以省略,代表任意修飾符;
傳回值不能省略
傳回值可以使用*作為通配符
JavaBean類要寫全類名
包名、類名、方法名
可以部分省略,頭和尾(頭:包名的第一級、尾:方法名)不能省略,中間的任意一部分都可以省略。
使用..進行省略,可以使用通配符
形參
可以省略不寫,省略不寫代表的是無參方法
可以通配:
*👉單個任意類型的參數
.. 👉任意參數:數量上的任意、類型上的任意
JavaBean要寫全類名
@annotation
使用自定義注解 指定增強的方法
在容器中的元件裡,給哪一個方法增加上自定義的注解,哪一個方法就被增強
如果多個方法要被增強,沒有什麼特别的規律,沒有辦法使用execution這種寫法,可以使用自定義注解這種寫法
以上就是AspectJ的advisor方法的介紹,接下來我們使用一個案例熟悉下使用方法
案例:在應用程式中有幾個方法比較特殊需要計算這幾個方法的執行時間
首先是在maven工程中導入依賴
接下來搭建我們的業務,這裡要注意,在需要增強的方法上加上自定義注解@CountTime
接下來是我們的自定義注解
接下來是我們的配置檔案,這裡需要我們自定義通知類(通知就是指導我們做增強的)
那麼這個advisor實際上就是對容器中通過切入點指定的這些方法按照通知的方式去做增強,這也是AspectJ的主要形式
接下來我們寫一個計算委托類執行時間的通知
測試類