繁体   English   中英

AspectJ Pointcut排除注释

[英]AspectJ Pointcut to exclude annotation

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

示例注释:

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语法中的Aspect:

package de.scrum_master.aspect;

import de.scrum_master.app.NoLogging;

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

@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);
    }
}

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

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())

这可能对你有所帮助

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM