AOP 切入点表达式,用于属于各种子包中的类的方法

问题描述 投票:0回答:1

上下文:我正在运行一个处理与外部合作伙伴和供应商交互的 Spring 服务。我正在实施一个监控方面来跟踪 QPS 以及每个外部 API 的其他性能指标。

它们的实现方式是有一个父类,该父类具有为每个供应商实现的抽象保护

execute()
方法。 (即每个供应商都有自己的类别)。

目录组织如下:

com.org.biz.vendor.impl.{vendor}.{vendorServiceProviderClass}

  • com/org/biz/service/vendor/impl/vendorA/VendorAServiceProvider
  • com/org/biz/service/vendor/impl/vendorB/VendorBServiceProvider

其中每个 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
    }

我也尝试过其他一些变体,但无论我尝试触发哪个供应商实现,我似乎都无法拦截该方法。我不确定是因为它是一个重写方法,还是因为它是受保护的。

任何帮助将不胜感激

spring aop spring-aop
1个回答
0
投票

尝试这样的事情(我为抽象基类发明了一个类和包名):

execution(* com.org.biz.service.base.AbstractProvider+.doExecute(..))

+
的意思是“包括子类”。

你也可以这样写:

within(com.org.biz.service.base.AbstractProvider+) && execution(* doExecute(..))

现在子类名和它们的包名不再重要了,因为你关注的是继承而不是命名。

© www.soinside.com 2019 - 2024. All rights reserved.