如果注释包含参数,则不执行建议

advice is not executing if the annotations contains parameters

我正在尝试获得一些执行建议。 当我使用不带参数的注解时,它会执行,但当注解包含参数时,它不会执行。

@Aspect
class  a{   
    @Pointcut("execution(@com.annotations.AnnotationName* *(..))")
    void someMethod() {}

    @Around("someMethod()")
    public Object aroundSomeMethod(ProceedingJoinPoint pjp) throws Throwable
    {
    // some code
    }
}

Annotation:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName
{
    public String someString();
    public boolean someBoolean();
}

The use of the annotation:

@AnnotationName(
        someString= "string",
        someBoolean = false
)
private void mycode()
{//code }

以下方面代码建议使用 @AnnotationName

注释的目标方法
@Component
@Aspect
public class SomeMethodAspect {

    @Pointcut("@annotation(annotationName) && within(so.qn69016852..*)")
    private void someMethod(AnnotationName annotationName) {}
    
    @Around("someMethod(annotationName)")
    public Object aroundSomeMethod(ProceedingJoinPoint pjp,AnnotationName annotationName) throws Throwable
    {
        System.out.println(annotationName.someString());
        System.out.println(annotationName.someBoolean());
        return pjp.proceed();
    }
}

一对 corrections/observations .

  1. Spring AOP 无法建议 Spring bean 的私有方法。 mycode() 方法应该在 bean 中,最好是 public。 ( Refer )
  2. Aspect 也应该是一个 spring bean。这可以通过用 @Component
  3. 注释方面来实现

记得限制范围:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#writing-good-pointcuts

您也可以通过@kriegaex 的 answer 了解为什么 @annotation 具有全局范围。

更新:

OP 共享的代码也适用于修改拼写错误(切入点表达式中 AnnotationName* 之间的 space )。之前分享的观察结果在这里也适用。

@Component
@Aspect
public class SomeMethodAspect {

    @Pointcut("execution(@so.qn69016852.anno.AnnotationName * so.qn69016852..*.*(..))")
    private void someMethod() {}
    
    @Around("someMethod() && @annotation(annotationName)")
    public Object aroundSomeMethod(ProceedingJoinPoint pjp,AnnotationName annotationName) throws Throwable
    {
        System.out.println(annotationName.someBoolean());
        System.out.println(annotationName.someString());
        return pjp.proceed();
    }
}