AOP重定向调用

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

我想使用AOP修改接口方法的调用,并通过反射通过SPI调用另一个实现。

有什么方法可以通过某种方式将Pointcut / Around重定向到调用?

这里是我的代码库

@Around(value = "@annotation(spiExtension)")
def aroundSourceMethod(joinPoint: ProceedingJoinPoint, spiExtension: SpiExtension): Unit = {
    val interfaces = joinPoint.getTarget.getClass.getInterfaces
    for(interface <- interfaces){
      if (implementationLoadedByClazz.get(interface) == null) {
        for (clazz <- ServiceLoader.load(interface)) {
          val extensionClass: SpiExtensions = ComponentUtil.getComponentByImplementation(clazz.getClass, interface)
          implementationsByCondition.put(extensionClass.condition, extensionClass)
          implementationLoadedByClazz.put(interface, extensionClass)
        }
      }
    }
    invokeSpecificImplementation(joinPoint)
  }

  private def invokeSpecificImplementation(joinPoint: ProceedingJoinPoint) = {
    val methodSignature = joinPoint.getSignature.asInstanceOf[MethodSignature]
    val method = methodSignature.getMethod
    val args = joinPoint.getArgs
    val condition = args.apply(0).asInstanceOf[String]
    val instance:Object = implementationsByCondition(condition)
    Proxy.getInvocationHandler(instance).invoke(instance, method, args)
  }

您可以看到,我使用反射调用了我想要的方法,但是对方法的原始请求会发生什么。我们通常会在@Around方法中添加joinPoint.proceed();

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

无限循环是因为AOP将以与原始相同的方式处理您的呼叫。您需要一种方法(一个标志)来捕获此类用例,并跳过第二个调用的操作。并且还要检查您是否具有动态代理,然后可以获取原始功能并直接调用它。

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