所以我为所有方法和特定注释的所有类定义了切入点...我想要做的是检索每个方法调用的注释值。这是我到目前为止所拥有的
@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.
}
}
答案 0 :(得分:1)
是的,您可以使用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
中给出的名称与方法参数匹配,并使用它来确定注释类型。然后通过beforeMyAnnotatedClassMethods
切入点将其传播到myAnnotatedClassMethods
建议。
然后Spring AOP堆栈将在调用@Before
方法之前查找注释值并将其作为参数传递。
如果您不喜欢上述解决方案,另一种方法是在您的建议方法中提供JoinPoint
参数。您可以使用它来使用getTarget
解析target
实例,并使用该值来获取类注释。例如,
@Before("myAnnotatedClassMethods()")
private void beforeMyAnnotatedClassMethods(JoinPoint joinPoint) {
System.out.println("my annotated class method detected: " + joinPoint.getTarget().getClass().getAnnotation(MyAnnotation.class));
}
如果目标进一步包含在其他代理中,我不确定这将如何表现。注释可能在代理类后面“隐藏”。小心使用。