1. 程式人生 > 實用技巧 >3.14@Pointcut的表示式-@args

3.14@Pointcut的表示式-@args

戴著假髮的程式設計師出品 抖音ID:戴著假髮的程式設計師歡迎關注

[檢視視訊教程]

限制與連線點的匹配(使用 Spring AOP 時執行方法),其中傳遞的實際 arguments 的執行時型別具有給定型別的註釋。

看看官方給的例子:

任何連線點(僅在 Spring AOP 中執行方法),它接受一個引數,並且傳遞的引數的執行時型別具有@Classified annotation:

1 @args(com.xyz.security.Classified)

這什麼意思呢,我來解釋一下,就是匹配有指定的引數,並且要求傳入的引數物件必須有制定的註解。

如果還不明白,看我的案例:

我們準備兩個交通工具類:

小汽車Car,在Car上新增我們自定義的註解

 1 /**
 2  * @author 戴著假髮的程式設計師
 3  * 
 4  * @description
 5  */
 6 @Component
 7 @DkAnnotation
 8 public class Car {
 9     @Override
10     public void move() {
11         System.out.println("小汽車動起來");
12     }
13 }

卡車Truck ,在Truck上不新增我們自定義的註解

 1 /**
 2  * @author 戴著假髮的程式設計師
3 * 4 * @description 5 */ 6 @Component 7 public class Truck { 8 @Override 9 public void move() { 10 System.out.println("卡車動起來"); 11 } 12 }

在定義一個駕駛員類Driver,有一個drive的方法,需要傳入交通工具作為引數:

 1 /**
 2  * @author 戴著假髮的程式設計師
 3  * 
 4  * @description
 5  */
 6 @Component
 7 public class
Driver { 8 public void driveCar(Car car){ 9 System.out.println("駕駛員開始駕駛小汽車"); 10 car.move(); 11 } 12 public void driveTruck(Truck truck){ 13 System.out.println("駕駛員開始駕駛卡車"); 14 truck.move(); 15 } 16 }

修改Aspect類配置:

 1 /**
 2  * @author 戴著假髮的程式設計師
 3  * 
 4  * @description
 5  */
 6 @Component //將當前bean交給spring管理
 7 @Aspect //定義為一個AspectBean
 8 public class DkAspect {
 9     //使用@arg配置傳入引數有DkAnnotation註解的方法
10     @Pointcut("@args(com.st.dk.demo7.annotations.DkAnnotation)")
11     private void pointCut1(){}
12     //定義一個前置通知
13     @Before("pointCut1()")
14     private static void befor(){
15         System.out.println("---前置通知---");
16     }
17 }

測試:

 1 @Test
 2 public void testAopPoint_args(){
 3     ApplicationContext ac =
 4             new AnnotationConfigApplicationContext(Appconfig.class);
 5     //獲取Car
 6     Car car =  ac.getBean(Car.class);
 7     //獲取Truck
 8     Truck truck =  ac.getBean(Truck.class);
 9     //獲取Driver
10     Driver driver = ac.getBean(Driver.class);
11     //傳入car
12     driver.driveCar(car);
13     //傳入truck
14     driver.driveTruck(truck);
15 }

結果:

我們發現driveCar方法會被增強,因為Car類有註解@DkAnnotation

這裡我們再列舉以下父子類已經介面實現的情況:

父子類的情況:看圖:

圖中T1~T4有繼承關係。 method1引數型別T1,method2引數型別T2。

情況1:我們在T1上新增對應的註解,其他子類不添加註解。

則T1的所有子類物件包括T1本身傳入method1都生效。傳入method2都不會被匹配。

情況2:我們再T2上添加註解其他的類不添加註解,

那麼method2中傳入T2,T3,T4都會被匹配。 method1傳入任何引數都不會被匹配。

結論就是,我們新增在對應的方法指定型別上時,這個型別本身和其子類都會生效,其他情況都不會匹配。

介面的情況和繼承關係的情況一致。