Spring AOP 排除部分 类

Spring AOP Exclude Some Classes

我正在使用 Spring AspectJ 来记录方法执行统计信息,但是,我想在不更改切入点表达式的情况下从中排除一些 类 和方法。

为了排除某些方法,我创建了一个用于过滤掉的自定义注释。但是我无法对 类.

做同样的事情

这是我的方面定义 -

@Around("execution(* com.foo.bar.web.controller.*.*(..)) "
            + "&& !@annotation(com.foo.bar.util.NoLogging)")
public Object log(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    // logging logic here
}

NoLogging是我自定义的排除方法注解

那么如何在不更改切入点表达式且不添加新顾问的情况下过滤掉某些 类?

根据 Spring AOP documentation

PCD can be &&'ed, ||'ed, and ! (negated) too.

所以我想这更多的是试错练习。我想你可以尝试像 && !@within @within 这样的东西适用于类型。或者你可以试试 !@target

但话又说回来,我认为这可能很棘手。

另一种方法:声明两个切入点定义并将它们组合起来。例如,here on the documentation page。我会先试试这个。像

@Pointcut(executionPC() && nonAnnotatedClassesPC() && nonAnnotatedMethodsPC())

免责声明:正如我所说,这看起来更像是反复试验。而且我没有一个明确的工作示例。

好的,所以我找到了解决方案 - 使用 @target PCD(切入点指示符)过滤掉具有特定注释的 classes。在这种情况下,我已经有了 @NoLogging 注释,所以我可以使用它。更新后的切入点表达式将变成如下 -

@Around("execution(* com.foo.bar.web.controller.*.*(..)) "
            + "&& !@annotation(com.foo.bar.util.NoLogging)" 
            + "&& !@target(com.foo.bar.util.NoLogging)")
public Object log(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    // logging logic here
}

解释-

execution(* com.foo.bar.web.controller.*.*(..)) - c.f.b.w.controller

中所有 class 的所有方法

"&& !@annotation(com.foo.bar.util.NoLogging)" - 上面没有 @NoLogging 注释

"&& !@target(com.foo.bar.util.NoLogging)" - 并且其 class 也没有 @NoLogging 注释。

所以现在我只需向任何 class 添加 @NoLogging 注释,我想将其方法从方面中排除。

可以在 Spring AOP 文档中找到更多 PCD - http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-pointcuts-designators