AspectJ Pointcut排除注释

时间:2014-06-27 08:33:16

标签: java spring spring-aop

我使用Spring AOP进行日志记录。我想创建一个适用于除具有特定注释的方法之外的所有方法的切入点,但我不知道如何去做。我发现的所有内容都是如何包含带注释的方法。

2 个答案:

答案 0 :(得分:11)

示例注释:

package de.scrum_master.app;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface NoLogging {}

驱动程序应用程序:

package de.scrum_master.app;

public class Application {
    public static void main(String[] args) throws Exception {
        foo();
        bar();
        zot();
        baz();
    }

    @NoLogging public static void foo() {}
    public static void bar() {}
    @NoLogging public static void zot() {}
    public static void baz() {}
}

原生AspectJ语法中的方面:

package de.scrum_master.aspect;

import de.scrum_master.app.NoLogging;

public aspect MyAspect {
    before() : execution(* *(..)) && !@annotation(NoLogging) {
        System.out.println(thisJoinPoint);
    }
}

@AspectJ语法中的方面(也应该在Spring AOP中起作用):

package de.scrum_master.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class MyAspectX {
    @Before("execution(* *(..)) && !@annotation(de.scrum_master.app.NoLogging)")
    public void logExceptAnnotated(JoinPoint thisJoinPoint) throws Throwable {
        System.out.println(thisJoinPoint);
    }
}

两个方面都是等效的,并产生以下输出:

execution(void de.scrum_master.app.Application.main(String[]))
execution(void de.scrum_master.app.Application.bar())
execution(void de.scrum_master.app.Application.baz())

答案 1 :(得分:0)

这可能对您有所帮助

execution(* my.package.*.*(..)) && !execution(@annotation * my.package.*.*(..))