如何在 spring 方面访问自定义注释值
how to access custom annotation values in spring aspect
我正在尝试从 jointCut 访问自定义注释值。但是我找不到办法。
我的示例代码:
@ComponentValidation(input1="input1", typeOfRule="validation", logger=Log.EXCEPTION)
public boolean validator(Map<String,String> mapStr) {
//blah blah
}
正在尝试访问 @Aspect
class。
但是,我没有看到任何访问值的范围。
我尝试访问的方式在代码下方
CodeSignature codeSignature = (CodeSignature) joinPoint.getSignature();
String[] names = codeSignature.getParameterNames();
MethodSignature methodSignature = (MethodSignature) joinPoint.getStaticPart().getSignature();
Annotation[][] annotations = methodSignature.getMethod().getParameterAnnotations();
Object[] values = joinPoint.getArgs();
我没有看到任何值 returns input = input1。如何实现。
要获取值,请使用以下内容:
ComponentValidation validation = methodSignature.getMethod().getAnnotation(ComponentValidation.class);
你可以调用 validation.getInput1()
,假设你在 ComponentValidation
自定义注释中有这个方法。
虽然 Jama Asatillayev 的回答从普通 Java 的角度来看是正确的,但它涉及反思。
但问题具体是关于 Spring AOP 或 AspectJ,并且有一种更简单、更规范的方法可以使用 AspectJ 语法将匹配的注释绑定到方面建议参数——顺便说一句,没有任何反射。
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import my.package.ComponentValidation;
@Aspect
public class MyAspect {
@Before("@annotation(validation)")
public void myAdvice(JoinPoint thisJoinPoint, ComponentValidation validation) {
System.out.println(thisJoinPoint + " -> " + validation);
}
}
例如,如果您在 Annotation 接口中定义了一个方法,如下所示:
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface AspectParameter {
String passArgument() default "";
}
然后您可以访问 class 和方法值,如下所示:
@Slf4j
@Aspect
@Component
public class ParameterAspect {
@Before("@annotation(AspectParameter)")
public void validateInternalService(JoinPoint joinPoint, AspectParameter aspectParameter) throws Throwable {
String customParameter = aspectParameter.passArgument();
}
}
我正在尝试从 jointCut 访问自定义注释值。但是我找不到办法。
我的示例代码:
@ComponentValidation(input1="input1", typeOfRule="validation", logger=Log.EXCEPTION)
public boolean validator(Map<String,String> mapStr) {
//blah blah
}
正在尝试访问 @Aspect
class。
但是,我没有看到任何访问值的范围。
我尝试访问的方式在代码下方
CodeSignature codeSignature = (CodeSignature) joinPoint.getSignature();
String[] names = codeSignature.getParameterNames();
MethodSignature methodSignature = (MethodSignature) joinPoint.getStaticPart().getSignature();
Annotation[][] annotations = methodSignature.getMethod().getParameterAnnotations();
Object[] values = joinPoint.getArgs();
我没有看到任何值 returns input = input1。如何实现。
要获取值,请使用以下内容:
ComponentValidation validation = methodSignature.getMethod().getAnnotation(ComponentValidation.class);
你可以调用 validation.getInput1()
,假设你在 ComponentValidation
自定义注释中有这个方法。
虽然 Jama Asatillayev 的回答从普通 Java 的角度来看是正确的,但它涉及反思。
但问题具体是关于 Spring AOP 或 AspectJ,并且有一种更简单、更规范的方法可以使用 AspectJ 语法将匹配的注释绑定到方面建议参数——顺便说一句,没有任何反射。
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import my.package.ComponentValidation;
@Aspect
public class MyAspect {
@Before("@annotation(validation)")
public void myAdvice(JoinPoint thisJoinPoint, ComponentValidation validation) {
System.out.println(thisJoinPoint + " -> " + validation);
}
}
例如,如果您在 Annotation 接口中定义了一个方法,如下所示:
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface AspectParameter {
String passArgument() default "";
}
然后您可以访问 class 和方法值,如下所示:
@Slf4j
@Aspect
@Component
public class ParameterAspect {
@Before("@annotation(AspectParameter)")
public void validateInternalService(JoinPoint joinPoint, AspectParameter aspectParameter) throws Throwable {
String customParameter = aspectParameter.passArgument();
}
}