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傳入任何參數都不會被匹配。

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

接口的情況和繼承關系的情況一致。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM