如何从触发Aspect方法调用中排除类

时间:2018-08-06 21:45:05

标签: aspectj spring-aop spring-aspects

我在@Aspect服务方法中有一个名为logChangesAndAnnounceNewContributions的方法,该方法在web应用中某处调用Spring-data的JpaRepository的save方法时就会触发。我不希望在Aspect类本身中使用save方法时调用logChanges方法,因此我在切入点定义!within(Services.SystemListenerService)中使用了此方法。但是它没有任何作用!尽管在定义中使用了此条件,仍然会调用save方法。完整的定义如下:

@AfterReturning("execution(* org.springframework.data.jpa.repository.JpaRepository.save(..))" +
           "&& !within(Services.SystemListenerService) && args(entity)")
    private void logChangesAndAnnounceNewContributions(Object entity){

我在这里想念什么?

编辑:我尝试将!inner内容更改为!within(@org.aspectj.lang.annotation.Aspect *),但这也不起作用。

1 个答案:

答案 0 :(得分:1)

假设Services.SystemListenerService是您方面的完全限定名称(类名SystemListenerService,包名称Services带有奇怪的大写首字母),within()不会之所以起作用,是因为在execution(* org.springframework.data.jpa.repository.JpaRepository.save(..))时我们无论如何都不是within(Services.SystemListenerService),而是within(org.springframework.data.jpa.repository.JpaRepository)。因此,切入点中存在逻辑错误。

在AspectJ中有解决此问题的方法,例如

  • call(A) && !adviceexecution()
  • execution(A) && !cflow(execution(B))

,但是两种切入点类型均为unsupported in Spring AOP。所以你

对不起,但是Spring AOP只是“ AOP lite”,我认为您应该选择AspectJ。第二个选项也有点棘手,但可能会起作用。