3.13 @Pointcut的表达式-@target

戴着假发的程序员出品  抖音ID:戴着假发的程序员  欢迎关注

[查看视频教程]

限制与连接点的匹配(使用 Spring AOP 时执行方法),其中执行 object 的 class 具有给定类型的 annotation。

我的解释就是:@target会匹配所有拥有@target指定注解类型的目标类。 注意是目标类,注解在接口和方法上面是无效的。

如果还不明白就看我的案例。

官方案例:

目标 object 具有@Transactional annotation 的任何连接点(仅在 Spring AOP 中执行方法):

@target(org.springframework.transaction.annotation.Transactional)

我们的案例:

我们自定义一个注解:

1 @Retention(RetentionPolicy.RUNTIME)
2 public @interface DkAnnotation {
3 }

在我们的BookService实现类上添加注解,注意是添加在实现类上,并不是接口和方法上。

 1 /**
 2  * @author 戴着假发的程序员
 3  * 
 4  * @description
 5  */
 6 @Component
 7 @DkAnnotation //我自己定义的注解,当然也可以使用其他注解
 8 public class BookService{
 9     @Override
10     public void saveBook(String title){
11         System.out.println("保存图书:"+title);
12     }
13     public void saveBook(String title,int count){
14         System.out.println("保存"+title+","+count+"次");
15     }
16 }

在Aspect类中添加pointcut配置:

 1 /**
 2  * @author 戴着假发的程序员
 3  * 
 4  * @description
 5  */
 6 @Component //将当前bean交给spring管理
 7 @Aspect //定义为一个AspectBean
 8 public class DkAspect {
 9     //使用@Target配置有DkAnnotation注解的目标类
10     @Pointcut("@target(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_Target(){
3     ApplicationContext ac =
4             new AnnotationConfigApplicationContext(Appconfig.class);
5     BookService bean = ac.getBean(BookService.class);
6     bean.saveBook("论一个假发程序员的修养");
7     bean.saveBook("java从入门到颈椎康复之路",10);
8 }

结果:

我们会发现我们的方法全部被增强了。

再次提醒:@target只是对目标类的注解生效,对接口和方法的注解是不生效的。对其子类也不生效。

我们让BooService实现接口IBookService,然后再IBookServie接口上添加注解@DkAnnotation,或者在某个方法上添加注解@DkAnnotion,都不会被匹配。如果只在父类上添加了注解,子类不添加注解,则子类的任何方法也不会被匹配。 这个我们这里就暂时不测试,你可以自己测试以下。

如果还没明白,建议查看视频讲解。

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