我遇到的问题与How to create an aspect on an Interface Method that extends from A "Super" Interface非常相似,但我的保存方法是在一个抽象的超类中。
结构如下 -
接口:
public interface SuperServiceInterface {
ReturnObj save(ParamObj);
}
public interface ServiceInterface extends SuperServiceInterface {
...
}
实现:
public abstract class SuperServiceImpl implements SuperServiceInterface {
public ReturnObj save(ParamObj) {
...
}
}
public class ServiceImpl implements ServiceInterface extends SuperServiceImpl {
...
}
我想检查对ServiceInterface.save
方法的任何调用。
我目前的切入点如下:
@Around("within(com.xyz.api.ServiceInterface+) && execution(* save(..))")
public Object pointCut(final ProceedingJoinPoint call) throws Throwable {
}
将保存方法放入ServiceImpl
时会触发,但在SuperServiceImpl
中则不会触发。
我在周围的切入点中缺少什么?
答案 0 :(得分:1)
我只想在
ServiceInterface
上切入点,如果我在SuperServiceInterface
上执行此操作,它还会截取同样继承自SuperServiceInterface
的接口上的保存调用吗?
是的,但您可以通过将target()
类型限制为ServiceInterface
来避免这种情况,如下所示:
@Around("execution(* save(..)) && target(serviceInterface)")
public Object pointCut(ProceedingJoinPoint thisJoinPoint, ServiceInterface serviceInterface)
throws Throwable
{
System.out.println(thisJoinPoint);
return thisJoinPoint.proceed();
}
答案 1 :(得分:0)
来自spring docs示例:
执行
AccountService
接口定义的任何方法:
execution(* com.xyz.service.AccountService.*(..))
在你的情况下,它应该如下工作:
execution(* com.xyz.service.SuperServiceInterface.save(..))