戴着假发的程序员出品 抖音ID:戴着假发的程序员 欢迎关注
@Pointcut的表达式-args
spring应用手册(第三部分)
限制匹配连接点(使用 Spring AOP 时执行方法),其中 arguments 是给定类型的实例。
这个很好理解,就是在所有的joint point (连接点)中匹配指定参数类型和个数的方法进行匹配。
官方案例:
args(java.io.Serializable)
我们的例子:
我们修改BookService类,添加一个重载sageBook方法:
/**
* @author 戴着假发的程序员
*
* @description
*/
@Component
public class BookService{
//一个String类型参数的方法
public void saveBook(String title){
System.out.println("保存图书:"+title);
}
//一个String类型,一个int类型参数的方法
public void saveBook(String title,int count){
System.out.println("保存"+title+","+count+"次");
}
}
修改的Aspect类:
/**
* @author 戴着假发的程序员
*
* @description
*/
@Component //将当前bean交给spring管理
@Aspect //定义为一个AspectBean
public class DkAspect {
//使用args指定对应参数类型的切入点,匹配两个参数一个Stirng和一个int类型的方法
@Pointcut("args(String,int)")
private void pointCut1(){}
//定义一个前置通知
@Before("pointCut1()")
private static void befor(){
System.out.println("---前置通知---");
}
}
测试:
@Test
public void testAopPointCutArgs(){
ApplicationContext ac =
new AnnotationConfigApplicationContext(Appconfig.class);
BookService bean = ac.getBean(BookService.class);
bean.saveBook("论一个假发程序员的修养");
bean.saveBook("java从入门到颈椎康复之路",10);
}
结果:
我们会发现一个参数的seveBook没有被增强,两个参数的seveBook被增强。
关于父类和接口情况如下:
@args(指定类型),如果指定类型是接口或者父类,则我们传入接口实现了和其子类,该方法都会匹配。
如果还不明白可以参看视频讲解。