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
答案 0 :(得分:1)
所有服务都在同一个包中吗?根据您的示例代码,我怀疑AService
和BService
位于package
包中,但CService
位于另一个包中。如果服务确实在不同的包中,您有一些选择:
"execution(* *.A+.needsToBeAdvised(*))