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传入任何参数都不会被匹配。
结论就是,我们添加在对应的方法指定类型上时,这个类型本身和其子类都会生效,其他情况都不会匹配。
接口的情况和继承关系的情况一致。
我是戴着假发的程序员,分享技术,分享经验,如果要转载,请注明:出自戴着假发的程序员