2
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ですか?

編集:

それを追加する必要がBServiceありCService、両方が同じパッケージに入っています。

ポイントカットを次のように変更すると:

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

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

それが機能する唯一の方法は、オーバーライドneedsTobeAdvised()する場合ですCService

4

1 に答える 1

1

すべてのサービスが同じパッケージに含まれていますか?サンプルコードからわかるように、私は、パッケージに含まれているAServiceと思われますが、別のパッケージに含まれていると思われます。サービスが実際に異なるパッケージに含まれている場合は、いくつかのオプションがあります。BServicepackageCService

  • 同じパッケージになるように移動します
  • ポイントカットをより一般的なものに変更します。例:"execution(* *.A+.needsToBeAdvised(*))
  • ポイントカットを追加する
于 2012-04-08T19:03:40.777 に答える