上下文:我正在运行一个处理与外部合作伙伴和供应商交互的 Spring 服务。我正在实施一个监控方面来跟踪 QPS 以及每个外部 API 的其他性能指标。
它们的实现方式是有一个父类,该父类具有为每个供应商实现的抽象保护
execute()
方法。 (即每个供应商都有自己的类别)。
目录组织如下:
com.org.biz.vendor.impl.{vendor}.{vendorServiceProviderClass}
即
其中每个 Provider 类重写
execute()
方法。它们都以 -Provider 后缀命名。
我尝试按如下方式应用切入点:
@Pointcut("execution(protected * com.org.biz.service.vendor.impl..*Provider.doExecute(..))")
public void monitoringPointCut() {
}
@Around("monitoringPointCut()")
public Object writeToMetrics(ProceedingJoinPoint pjp) throws Throwable {
// compute metrics and write to logs
}
我也尝试过其他一些变体,但无论我尝试触发哪个供应商实现,我似乎都无法拦截该方法。我不确定是因为它是一个重写方法,还是因为它是受保护的。
任何帮助将不胜感激
尝试这样的事情(我为抽象基类发明了一个类和包名):
execution(* com.org.biz.service.base.AbstractProvider+.doExecute(..))
+
的意思是“包括子类”。
你也可以这样写:
within(com.org.biz.service.base.AbstractProvider+) && execution(* doExecute(..))
现在子类名和它们的包名不再重要了,因为你关注的是继承而不是命名。