【问题标题】:Spring AOP Exclude Some ClassesSpring AOP 排除一些类
【发布时间】:2016-08-08 06:58:00
【问题描述】:

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

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

【问题讨论】:

  • 我认为这是不可能的,执行将与您的定义相匹配,并在开始时加载。也许您可以尝试创建一个新的 @Around 方面并检查它是否覆盖了以前的方面。但我不确定。

标签: spring spring-aop spring-aspects


【解决方案1】:

好的,所以我找到了解决方案 - 使用 @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 注释添加到我想从方面中排除其方法的任何类。

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

【讨论】:

  • 嗨,是否也可以添加您的 @NoLogging 自定义注释实现,我无法从类似的避免日志记录场景中过滤掉方法。
  • @harmonious 注释不包含任何逻辑。你可以在这里找到它 - github.com/harshilsharma63/controller-logger/blob/master/src/…
  • @harmonious 同样,我创建了一个开源库来处理所有基于 AOP 的日志记录逻辑。你可以在github.com/harshilsharma63/controller-logger查看。也许它已经完成了你的任务?
  • 谢谢@harshil-sharma 我得到了它的工作:@Target(ElementType.METHOD ) public @interface NoLogging { }
【解决方案2】:

根据Spring AOP documentation

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    相关资源
    最近更新 更多