戴着假发的程序员出品 抖音ID:戴着假发的程序员 欢迎关注
@Pointcut的表达式-@target
spring应用手册(第三部分)
限制与连接点的匹配(使用 Spring AOP 时执行方法),其中执行 object 的 class 具有给定类型的 annotation。
我的解释就是:@target会匹配所有拥有@target指定注解类型的目标类。 注意是目标类,注解在接口和方法上面是无效的。
如果还不明白就看我的案例。
官方案例:
目标 object 具有@Transactional annotation 的任何连接点(仅在 Spring AOP 中执行方法):
@target(org.springframework.transaction.annotation.Transactional)
我们的案例:
我们自定义一个注解:
@Retention(RetentionPolicy.RUNTIME)
public @interface DkAnnotation {
}
在我们的BookService实现类上添加注解,注意是添加在实现类上,并不是接口和方法上。
/**
* @author 戴着假发的程序员
*
* @description
*/
@Component
@DkAnnotation //我自己定义的注解,当然也可以使用其他注解
public class BookService{
@Override
public void saveBook(String title){
System.out.println("保存图书:"+title);
}
public void saveBook(String title,int count){
System.out.println("保存"+title+","+count+"次");
}
}
在Aspect类中添加pointcut配置:
/**
* @author 戴着假发的程序员
*
* @description
*/
@Component //将当前bean交给spring管理
@Aspect //定义为一个AspectBean
public class DkAspect {
//使用@Target配置有DkAnnotation注解的目标类
@Pointcut("@target(com.st.dk.demo7.annotations.DkAnnotation)")
private void pointCut1(){}
//定义一个前置通知
@Before("pointCut1()")
private static void befor(){
System.out.println("---前置通知---");
}
}
测试:
@Test
public void testAopPoint_Target(){
ApplicationContext ac =
new AnnotationConfigApplicationContext(Appconfig.class);
BookService bean = ac.getBean(BookService.class);
bean.saveBook("论一个假发程序员的修养");
bean.saveBook("java从入门到颈椎康复之路",10);
}
结果:
我们会发现我们的方法全部被增强了。
再次提醒:@target只是对目标类的注解生效,对接口和方法的注解是不生效的。对其子类也不生效。
我们让BooService实现接口IBookService,然后再IBookServie接口上添加注解@DkAnnotation,或者在某个方法上添加注解@DkAnnotion,都不会被匹配。如果只在父类上添加了注解,子类不添加注解,则子类的任何方法也不会被匹配。 这个我们这里就暂时不测试,你可以自己测试以下。
如果还没明白,建议查看视频讲解。