2

我有一个非常相似的问题: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 {
}

当 save 方法被放入时它会被触发ServiceImpl,但不是在SuperServiceImpl. 我的周围切入点缺少什么?

4

2 回答 2

2

我只是想切入点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();
}
于 2015-01-24T13:34:48.217 回答
0

spring 文档示例中:

AccountService接口定义的任何方法的执行:
execution(* com.xyz.service.AccountService.*(..))

在您的情况下,它应该按如下方式工作:

execution(* com.xyz.service.SuperServiceInterface.save(..))

于 2015-01-23T10:31:26.093 回答