简介
在尝试使用apo做注解的时候,遇到了这个问题
错误代码如下
@Pointcut("execution(* com.example.demo.controller.*.*(..))" )
private void pointcut2() {}
@Around(value = "pointcut2()")
public void processAuthority(ProceedingJoinPoint call,MyAnnotation around) throws Throwable {
System.out.println("ANNOTATION welcome");
// System.out.println("ANNOTATION 调用方法:"+ around.methodName());
System.out.println("ANNOTATION 调用类:" + call.getSignature().getDeclaringTypeName());
System.out.println("ANNOTATION 调用类名" + call.getSignature().getDeclaringType().getSimpleName());
MethodSignature methodSignature = (MethodSignature) call.getSignature();
Method method = methodSignature.getMethod();
MyAnnotation myAnnotation=method.getAnnotation(MyAnnotation.class);
String name=myAnnotation.methodName();
System.out.println(name);
如果将processAuthority方法中的MyAnnotation around入参去掉,那么将不会出错,这是为什么呢?
解析
花了一下午,终于找到了原因,入参不匹配,因为采用了@Around方法,同时指定了连接点是pointcut2()方法匹配的连接点
但是该发方法默认是入参一个ProceedingJoinPoint ,而我们多了一个入参around,此时pointcut2()没有对应的入参,应该修改为
@Pointcut("execution(* com.example.demo.controller.*.*(..)) && args(around)", argNames = "around" )
private void pointcut2(MyAnnotation around) {}
此时再去用这个连接点匹配,就可以通过了。也就是你@Around处理方法,用到了@PointCut匹配连接点,只要多一个参数,就需要在连接点
多写一个入参,这样才会匹配到。
总结
将方法参数绑定到切面上, 那么也应该在切面入口添加对应参数与匹配