Spring AOP排除了一些类

时间:2016-08-08 06:58:00

标签: spring spring-aop spring-aspects

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

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

2 个答案:

答案 0 :(得分:21)

好的,所以我找到了解决方案 - 使用@target PCD(切入点指示符)来过滤掉具有特定注释的类。在这种情况下,我已经有@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注释添加到我希望从方面中排除其方法的任何类。

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

答案 1 :(得分:4)

根据Spring AOP documentation

  

PCD可以&&'ed,||'和! (否定)。

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

但是我认为这可能很棘手。

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

这样的东西
@Pointcut(executionPC() && nonAnnotatedClassesPC() && nonAnnotatedMethodsPC())

免责声明:正如我所说,这看起来更像是试错。我没有明确的工作实例。