我有一个非常类似于的问题:How to create an aspect on an Interface Method that extends from A "Super" Interface,但是我的save方法在抽象的超类中。

结构如下-

接口:

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 {
}


将save方法放入ServiceImpl时将触发该事件,但将其放入SuperServiceImpl时则不会触发该事件。
我的切入点缺少什么?

最佳答案

我只想在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();
}

09-10 15:28