我们平时在使用springAop的时候,经常是将某一个方法定义为一个切入点,用来做前置,后置或环绕增强,但如果想得到切入点方法的参数,以及它的返回值就需要做一些特定的配置。
普通的切面如下:
代码语言:javascript复制@Configuration
@Aspect
public class UserInfoAspect {
@Pointcut("execution(* com.*.test(*))")
public void test() {}
@AfterReturning(value = "test()"")
public void logMethodCall() throws Throwable {
System.out.println("进入后置增强了!");
}
}
获取切入点方法的参数:
代码语言:javascript复制@Configuration
@Aspect
public class UserInfoAspect {
@Pointcut("execution(* com.*.test(*))")
public void test() {}
//使用JoinPoint 对象可以接收到切入点方法的参数
@AfterReturning(value = "test()")
public void logMethodCall(JoinPoint jp) throws Throwable {
System.out.println("进入后置增强了!");
String name = jp.getSignature().getName();
System.out.println(name);
Object[] args = jp.getArgs();
for (Object arg : args) {
System.out.println("参数:" arg);
}
}
}
由上可以看到,使用JoinPoint对象即可获取切点方法的参数值。
获取返回值的写法:
代码语言:javascript复制@Configuration
@Aspect
public class UserInfoAspect {
@Pointcut("execution(* com.*.test(*))")
public void test() {}
//在事件通知类型中申明returning即可获取返回值
@AfterReturning(value = "test()", returning="returnValue")
public void logMethodCall(JoinPoint jp, Object returnValue) throws Throwable {
System.out.println("进入后置增强了!");
String name = jp.getSignature().getName();
System.out.println(name);
Object[] args = jp.getArgs();
for (Object arg : args) {
System.out.println("参数:" arg);
}
System.out.println("方法返回值为:" returnValue);
}
}
由上可以看到,再申明事件通知的类型中申明"returing=returnValue",而后再切面的方法中引入 “Object returnValue”即可获取返回值。
如果你想同时拥有多个切入点的话,可以使用逻辑操作符 “&&”,“||”等,如下所示:
代码语言:javascript复制@Pointcut("execution(* com.*.(*))")
public void addUser() {}
@Pointcut("execution(* com.*.(*))")
public void updateUser() {}
@After(value = "addUser() || updateUser()", returning="returnValue")
public void pushAccountInfo(JoinPoint jp, Object returnValue){
//这里写切面逻辑:
}
这里需要注意的是逻辑操作符的使用,容易让人混淆的是 “&&”与”||" 的区别,如果你想一个切面能同时对多个切入点生效,应该使用的是“||”,而不是“&&”。