当前位置: 首页 > 知识库问答 >
问题:

Spring AOP-建议子类中未重写的超类方法

巫研
2023-03-14
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.

如果我将我的点切改为以下内容:

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

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

它的唯一工作方式是在cservice中重写needstobeadvide()

共有1个答案

太叔高义
2023-03-14

所有服务都在同一个包里吗?根据示例代码,我怀疑AServiceBServicepackage包中,但CService在另一个包中。如果服务确实在不同的包中,您有一些选择:

  • 移动以使它们在同一个包中
  • 更改切入点,使其更加通用,例如“execution(**.a+.needstobeadvide(*))
  • 添加更多切入点
 类似资料:
  • 我有一个基类,它定义了类方法,用于返回用于构建服务url的各种信息。基类还定义了一个用于构建该url的实例方法。我希望基类有这个方法的默认实现,这样当我需要url不同时,我只需要在子类中重写它。我如何让这个基方法调用重写的类方法来使用子类中的类方法构建url?下面是我现在的代码,但它不起作用: 基类方法: op ationId、operationVersion和方法类型是在子类中实现的类方法,但是

  • 我在调用覆盖方法的子类方法时遇到了问题,所以我创建了一个小应用程序来测试它。当超类调用其子类覆盖的方法时,仍然调用超类的方法版本,而不是子类的版本,后者覆盖了超类的方法,应该是被调用的方法。 预期输出:

  • 我的类KTree正在扩展抽象类GraphClass,但无法重写GraphClass中定义的一个方法。 原始方法添加(E E,V V,V v1)在界面无向图中定义 在类中,addEdge(E E,V V,V v1)抛出错误 “KTree”中的“addEdge(E,V,V)”与“GraphClass”中的“addEdge(E,V,V)”冲突;两种方法具有相同的擦除,但都不重写另一种方法 KTree中的

  • 在java中,我们可以缩小返回类型和throws异常类型(甚至删除throws子句): 但是,参数类型呢(如果A采用< code>T,那么为什么B不采用< code >?超级T)如: 让我们考虑一下我认为完全符合逻辑的这段代码: 所以我要说的是,在使用的代码上下文中仍然有效。

  • 我有一个主类。应用程序中有许多子类是从类扩展而来的。base类公开公共方法,如下所示: 应用程序将在子实例上调用以获得一个检查器实例。每个子类都可以有自定义的基本检查器和验证检查器。他们可以使用和方法实现它,但是他们不能覆盖基类的,因为它包含处理逻辑。 在这里使用关键字合适吗?

  • 我有一个 但当我这么做的时候, 我该怎么解决这个问题?游戏是超级超级类...