如何为通知方法提供切入点绑定注释?

时间:2016-05-04 16:51:12

标签: java spring spring-aop

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

@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.

    }

}

1 个答案:

答案 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));
}

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