gpt4 book ai didi

java - 如何为通知方法提供切入点绑定(bind)注释?

转载 作者:行者123 更新时间:2023-11-30 07:24:11 26 4
gpt4 key购买 nike

所以我已经为特定注释的所有方法和所有类定义了切入点...我想要做的是在每个方法调用上检索注释值。这是我到目前为止所拥有的

@Aspect
public class MyAspect {

@Pointcut("execution(* my.stuff..*(..))")
private void allMethods(){}

@Pointcut("within(@my.stuff.MyAnnotation*)")
private void myAnnotations(){}

@Pointcut("allMethods() && myAnnotations()")
private void myAnnotatedClassMethods(){}

@Before("myAnnotatedClassMethods()")
private void beforeMyAnnotatedClassMethods(){
System.out.println("my annotated class method detected.");
// I'd like to be able to access my class level annotation's value here.

}

}

最佳答案

是的,您可以让 Spring AOP 提供注释目标对象类的注释值。

您必须使用binding forms documented in the specification并在您的 @Pointcut 方法中传播参数。

例如

@Pointcut("execution(* my.stuff..*(..))")
private void allMethods() {
}

@Pointcut("@within(myAnnotation)")
private void myAnnotations(MyAnnotation myAnnotation) {
}

@Pointcut("allMethods() && myAnnotations(myAnnotation)")
private void myAnnotatedClassMethods(MyAnnotation myAnnotation) {
}

@Before("myAnnotatedClassMethods(myAnnotation)")
private void beforeMyAnnotatedClassMethods(MyAnnotation myAnnotation){
System.out.println("my annotated class method detected: " + myAnnotation);
}

Spring 从 myAnnotations 切入点开始,会将 @within 中给出的名称与方法参数相匹配,并使用它来确定注释类型。然后通过 myAnnotatedClassMethods 切入点向下传播到 beforeMyAnnotatedClassMethods 建议。

Spring AOP 堆栈将在调用 @Before 方法之前查找注释值并将其作为参数传递。

<小时/>

如果您不喜欢上述解决方案,另一种方法是简单地提供 JoinPoint您的建议方法中的参数。您可以使用它来解析 getTargettarget 实例。并使用该值来获取类注释。例如,

@Before("myAnnotatedClassMethods()")
private void beforeMyAnnotatedClassMethods(JoinPoint joinPoint) {
System.out.println("my annotated class method detected: " + joinPoint.getTarget().getClass().getAnnotation(MyAnnotation.class));
}

我不确定如果目标进一步包含在其他代理中,这将如何表现。该注释可能“隐藏”在代理类后面。小心使用。

关于java - 如何为通知方法提供切入点绑定(bind)注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37033713/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com