戴着假发的程序员出品 抖音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,都不会被匹配。如果只在父类上添加了注解,子类不添加注解,则子类的任何方法也不会被匹配。 这个我们这里就暂时不测试,你可以自己测试以下。
如果还没明白,建议查看视频讲解。