AspectJ Pointcut排除注释

hoo*_*hal 7 java spring spring-aop

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

kri*_*aex 11

示例注释:

package de.scrum_master.app;

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

@Retention(RetentionPolicy.RUNTIME)
public @interface NoLogging {}
Run Code Online (Sandbox Code Playgroud)

司机申请:

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() {}
}
Run Code Online (Sandbox Code Playgroud)

原生AspectJ语法中的Aspect:

package de.scrum_master.aspect;

import de.scrum_master.app.NoLogging;

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

@AspectJ语法中的Aspect(也应该在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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())
Run Code Online (Sandbox Code Playgroud)