自定义注解携带参数时Spring AOP的Advice通知不执行如何解决
问题原因及修复方案
- 切点表达式语法错误
你当前使用的切点表达式@Pointcut("execution(@com.annotations.AnnotationName* *(..))")存在格式问题:注解类名AnnotationName后直接拼接了通配符*,没有空格分隔,Spring会将AnnotationName*整体作为注解类名的匹配规则,无法匹配到你定义的AnnotationName注解,同时表达式缺少方法返回值的匹配位。
正确的匹配所有标注了该注解的方法的切点写法:
@Pointcut("execution(* @com.annotations.AnnotationName *.*(..))") void someMethod() {}
如果需要在通知中直接获取注解的参数值,可以用更简洁的注解绑定写法:
@Aspect class A{ @Around("execution(* *(..)) && @annotation(annotationName)") public Object aroundSomeMethod(ProceedingJoinPoint pjp, AnnotationName annotationName) throws Throwable { // 直接调用方法即可获取注解参数 String str = annotationName.someString(); boolean bool = annotationName.someBoolean(); return pjp.proceed(); } }
- 目标方法为private权限
Spring AOP基于动态代理实现,默认只能拦截public、protected、包可见的实例方法,private方法不会被代理对象识别,自然无法触发通知。如果必须拦截private方法,需要开启AspectJ静态织入能力,否则请将目标方法的访问权限修改为非private即可。
注:你定义的注解已经配置了@Retention(RetentionPolicy.RUNTIME),运行时可被识别,这部分配置无需修改。
内容的提问来源于stack exchange,提问作者Gutiel67
相关产品推荐
相关产品推荐

