建议中的注释值

时间:2013-10-13 12:03:15

标签: spring aspectj spring-aop

我想在建议中访问我的注释值,我的注释可以放在类型或方法上。 到目前为止,我可以在应用于方法时获取注释值,但在注释应用于类型时没有成功。

@Before( value = "(@annotation(varun.mis.aspect.Logged) || within(@varun.mis.aspect.Logged *)) && (@annotation(logged))",argNames = "logged" )

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

我不相信你可以在应用于类型

时将注释作为参数

以下切入点表达式

@Before("@annotation(com.some.TestAnnotation) || within(@com.some.TestAnnotation *)")

将匹配带注释的方法或带注释的类。然后,您可以声明建议以从方法或类

获取注释
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
TestAnnotation annotation = methodSignature.getMethod().getAnnotation(TestAnnotation.class);
if (annotation == null) {
    Class<?> clazz = methodSignature.getDeclaringType();
    annotation = clazz.getAnnotation(TestAnnotation.class);
    if (annotation == null) {
        System.out.println("impossible");
    } else {
        System.out.println("class has it");
    }
} else {
    System.out.println("method has it");
}

您还应该考虑方法和类型都有注释的情况。

答案 1 :(得分:0)

请直接使用注释尝试以下操作:在com.mycompany.MyAnnotation yourAnnotation中添加advice params,在@annotation(yourAnnotation)中添加@Around

@Around("execution(public * *(..)) && @annotation(yourAnnotation)")
public Object procede(ProceedingJoinPoint pjp, com.mycompany.MyAnnotation yourAnnotation) {
    ...
    yourAnnotation.value(); // get your annotation value directly;
    ...
}
建议参数中的

com.mycompany.MyAnnotation就像在

中那样工作
@Around("execution(public * *(..)) && @annotation(com.mycompany.MyAnnotation)")

yourAnnotation可以是有效的变量名,因为params中的MyAnnotation已经指出它应该是哪个注释。这里yourAnnotation仅用于检索注释实例。

如果您想传递更多参数,可以尝试args()