Aspect切入点使用注释属性

时间:2014-06-23 16:27:19

标签: java annotations aspectj

有一个TraceAspect应该对使用Trace注释注释的任何方法或类(所有类的方法)执行一些日志记录。

@Aspect
public class TraceAspect {    
    @Pointcut("(@annotation(Trace) || @within(Trace)) && execution(* *(..))")
    void allAnnotated(){}

    @Around("allAnnotated()")
    public Object trace(final ProceedingJoinPoint joinPoint) throws Throwable {
        // doing some stuff here
    }
}

和注释:

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Trace {
    boolean enabled() default true;
}

我需要修改切入点,以便跳过所有设置为false的Trace.enabled的方法/类(不被视为连接点)。

@Pointcut("allAnnotated() && Trace.enabled")

或(如果不可能)至少在建议中使用Annotation及其值,以便我可以检查属性并跳过记录...

1 个答案:

答案 0 :(得分:2)

查看https://eclipse.org/aspectj/doc/released/README-160.html

中的'注释值匹配'

你能做的是:

@Pointcut("execution(@Trace(enabled=true) * *(..)) || execution(* (@Trace(enabled=true) *).*(..))")

第一个是方法级别注释,第二个是类型级别注释。在@annotation / @中嵌入值的语法还没有(所以你不能做@annotation(Trace(enabled=true))