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。