如果注释包含参数,则不执行建议
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 .
- Spring AOP 无法建议 Spring bean 的私有方法。
mycode()
方法应该在 bean 中,最好是 public。 ( Refer )
Aspect
也应该是一个 spring bean。这可以通过用 @Component
注释方面来实现
记得限制范围: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();
}
}
我正在尝试获得一些执行建议。 当我使用不带参数的注解时,它会执行,但当注解包含参数时,它不会执行。
@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 .
- Spring AOP 无法建议 Spring bean 的私有方法。
mycode()
方法应该在 bean 中,最好是 public。 ( Refer ) Aspect
也应该是一个 spring bean。这可以通过用@Component
注释方面来实现
记得限制范围: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();
}
}