Spring AOP - 建议不在子类中重写的超类方法

时间:2012-04-08 15:26:10

标签: spring aop spring-aop

public abstract class AService<T> {
  public T needsToBeAdvised(T param) {
    T result = doSomething(param);
    return result;
  }
}

@Service
public class BService extends AService<B> {
  @Override
  public T needsToBeAdvised(T param) {
    return super.needsToBeAdvised(param);
  }
}

@Service
public class CService extends AService<C> {}

// (B & C implement an interface AType)

@Component
@Aspect
public class MyAspect {
  @Pointcut("execution(* package.AService+.needsToBeAdvised(*))")
  private void aNeedToBeAdvised() {}

  @AfterReturning(pointcut="aNeedToBeAdvised()", returning="param")
  public void interceptNeedsToBeAdvised(JoinPoint joinPoint, AType param) {
    // some action
  }
}

鉴于此设置:

bService.needsToBeAdvised(bParam) //is intercepted

但是,

cService.needsToBeAdvised(cParam) //is NOT.

如何在不覆盖needsToBeAdvised()中的CService的情况下实现此目的?

编辑:

我应该补充说BServiceCService都在同一个包中。

如果我将我的切入点改为以下内容:

@Pointcut("execution(* package.CService.needsToBeAdvised(*))")

cService.needsToBeAdvised(cParam) //is still not intercepted

唯一有效的方法是覆盖needsTobeAdvised()

中的CService

1 个答案:

答案 0 :(得分:1)

所有服务都在同一个包中吗?根据您的示例代码,我怀疑AServiceBService位于package包中,但CService位于另一个包中。如果服务确实在不同的包中,您有一些选择:

  • 移动以便它们位于同一个包中
  • 将您的切入点更改为更通用,例如"execution(* *.A+.needsToBeAdvised(*))
  • 添加更多切入点