3.14@Pointcut的表示式-@args
阿新 • • 發佈:2020-10-18
戴著假髮的程式設計師出品 抖音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 classDriver { 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傳入任何引數都不會被匹配。
結論就是,我們新增在對應的方法指定型別上時,這個型別本身和其子類都會生效,其他情況都不會匹配。
介面的情況和繼承關係的情況一致。