超抽象超类中实现的超级接口方法

时间:2015-01-23 09:38:00

标签: java aspectj spring-aop pointcut

我遇到的问题与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中则不会触发。 我在周围的切入点中缺少什么?

2 个答案:

答案 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(..))