戴着假發的程序員出品 抖音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傳入任何參數都不會被匹配。
結論就是,我們添加在對應的方法指定類型上時,這個類型本身和其子類都會生效,其他情況都不會匹配。
接口的情況和繼承關系的情況一致。