我在@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 *)
,但这也不起作用。
答案 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。所以你
((Advised) myProxy).getTargetSource().getTarget()
get the real object underneath the proxy并从您的方面直接在该对象上调用该方法对不起,但是Spring AOP只是“ AOP lite”,我认为您应该选择AspectJ。第二个选项也有点棘手,但可能会起作用。