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传入任何参数都不会被匹配。

结论就是,我们添加在对应的方法指定类型上时,这个类型本身和其子类都会生效,其他情况都不会匹配。

接口的情况和继承关系的情况一致。

posted @ 2020-10-18 16:43  戴着假发的程序员0-1  阅读(842)  评论(0编辑  收藏  举报