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

Aspectj 如何从触发方面方法调用中排除类,aspectj,spring-aop,spring-aspects,Aspectj,Spring Aop,Spring Aspects,我在@Aspect服务方法中有一个名为logchanges和announcenewcontributions的方法,每当在webapp的某个地方调用Spring data的JpaRepository的save方法时,就会触发该方法。我不希望在方面类本身中使用save方法时调用logChanges方法,因此我在切入点定义中使用了它!在(Services.SystemListenerService)中。但是它没有任何效果!尽管在定义中使用了此条件,仍将调用save方法。完整定义如下所示: @Afte

我在
@Aspect
服务方法中有一个名为
logchanges和announcenewcontributions
的方法,每当在webapp的某个地方调用Spring data的
JpaRepository的save方法时,就会触发该方法。我不希望在方面类本身中使用save方法时调用logChanges方法,因此我在切入点定义
中使用了它!在(Services.SystemListenerService)中
。但是它没有任何效果!尽管在定义中使用了此条件,仍将调用save方法。完整定义如下所示:

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


编辑:我试过改变!在
的内容中!在(@org.aspectj.lang.annotation.Aspect*)
内,但这也不起作用。

假设
Services.SystemListenerService
是方面的完全限定名(类名
SystemListenerService
,包名
Services
首字母大写奇怪),
内()
不起作用,因为在执行时(*org.springframework.data.jpa.repository.JpaRepository.save(..)
我们不在(Services.SystemListenerService)之内,而是在(org.springframework.data.jpa.repository.JpaRepository)之内。因此,切入点中存在逻辑错误

在AspectJ中有一些方法可以解决这个问题,例如

  • 呼叫(A)&&!adviceexecution()
  • 执行(A)&&!cflow(执行(B))
但这两种切入点类型都是。那么你呢

  • 无论是在春天还是在春天都需要
  • 或者滥用一些Spring方法,以便通过
    ((建议)myProxy).getTargetSource().getTarget()
    直接从您的方面对该对象调用该方法
  • 或者从新创建的异常或当前线程获取堆栈跟踪,并手动检查它-非常难看

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

假设
服务.SystemListenerService
是方面的完全限定名(类名
SystemListenerService
,包名
服务
,首字母大写奇怪),
在()
不起作用,因为在执行时(*org.springframework.data.jpa.repository.JpaRepository.save(..)我们不在(Services.SystemListenerService)之内,而是在(org.springframework.data.jpa.repository.JpaRepository)之内。因此,切入点中存在逻辑错误

在AspectJ中有一些方法可以解决这个问题,例如

  • 呼叫(A)&&!adviceexecution()
  • 执行(A)&&!cflow(执行(B))
但这两种切入点类型都是。那么你呢

  • 无论是在春天还是在春天都需要
  • 或者滥用一些Spring方法,以便通过
    ((建议)myProxy).getTargetSource().getTarget()
    直接从您的方面对该对象调用该方法
  • 或者从新创建的异常或当前线程获取堆栈跟踪,并手动检查它-非常难看

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

答案不错。最后,我做了一个变通,在中使用
来指示应该在哪个类中调用aspect方法,而不是在哪个类中不应该调用aspect。回答得很好。最后,我做了一个变通,在
中使用
来指示应该在哪个类中调用aspect方法,而不是在哪个类中不应该调用aspect。