18

我正在使用 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是我排除方法的自定义注释。

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

4

2 回答 2

28

好的,所以我找到了解决方案 - 使用@targetPCD(切入点指示符)过滤掉具有特定注释的类。在这种情况下,我已经有了@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-包中所有类的所有方法

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

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

所以现在我只需将@NoLogging注释添加到我希望从方面中排除其方法的任何类。

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

于 2016-08-10T06:45:38.067 回答
4

根据Spring AOP 文档

PCD 可以是 &&'ed、||'ed 和 ! (否定)也是。

所以我想这更多的是试错练习。我认为您可以尝试类似&& !@within@within 的方法适用于类型。或者你可以试试!@target

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

另一种方法:声明两个切入点定义并将它们组合起来。例如,在文档页面上。我会先试试这个。就像是

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

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

于 2016-08-08T11:34:18.880 回答