Spring AOP围绕Abstract的Abstract方法调用一些方法class

Spring AOP invoking some methods around Abstract method of Abstract class

我有一个摘要class喜欢

public abstract class EventHandler<T> {
  public <T> void preProcess(Message<T> message) {
    // do some pre-processing with the Message
  }

  protected abstract void handleEvent(Message<T> message) throws Exception;

  public <T> void postProcess(Message<T> message) {
    // do some post-processing with the Message
  }
}

有具体的 class 是从这个 Class 延伸出来的。 当在具体 class.

上调用 handleEvent 方法时,我希望能够使用 @Around 方面调用抽象 class 中的 preProcess() 和 postProcess() 方法

我正在尝试定义如下方面

@Aspect
@Configuration
public class SomeAspect {

  @Around(value = "execution(* com.handler.EventHandler+.handleEvent(..)))")
  public void around(ProceedingJoinPoint proceedingJoinPoint) {
    1. invoke preProcess

    2. invoke the join point

    3. invoke postProcess 
  }
}

我如何实现我正在寻找的东西?

更新

@Aspect
@Component
public class SomeAspect {
  private Logger logger = LoggerFactory.getLogger(TenantAspect.class);

  @Around(value = "execution(* com.handler.EventHandler+.handleEvent(..))) && within(com.handler..*) && this(eventHandler) && args(message))")
  public void around(ProceedingJoinPoint proceedingJoinPoint, EventHandler<Object> eventHandler, Message<Object> message) {

  }
}

尝试了以上方法,编译器给出了事件处理程序和消息的未绑定切入点参数

以下看点也可以做到这一点。

说明

execution(* com.handler.EventHandler+.handleEvent(..)) - 执行名为 handleEvent 的方法,该方法属于 EventHandler

的子类型

Designators

within(com.handler..*) - 在给定包

中建议类的范围界定器

Passing parameters to advice

this(eventHandler) - 执行方法的对象。 target()也可以用

args(message) - 运行时传递的参数

备注

一个方面最好用 @Component 注释并且 @Configuration 用于配置。

within添加以缩小范围advice.Please根据需要修改

@Aspect
@Component
public class EventHandlerAspect {

        @Around(value = "execution(* com.handler.EventHandler+.handleEvent(..)) "
        + "&& within(com.handler..*) "
        + "&& this(eventHandler) "
        + "&& args(message))")
       public Object around(ProceedingJoinPoint proceedingJoinPoint, 
        EventHandler<Object> eventHandler,
        Message<Object> message) throws Throwable {
            Object obj = null;
           // 1. invoke preProcess
            eventHandler.preProcess(message);
            try {
                // 2. invoke the join point
                obj = proceedingJoinPoint.proceed();
            } finally {
                // 3. invoke postProcess
                eventHandler.postProcess(message);
            }
            return obj;
         }
      }

希望这对您有所帮助。

可以直接从proceedingJoinPoint获取目标对象,如下:

((TestClass<Integer>) proceedingJoinPoint.getTarget()).preProcess(message);
 //or
((TestClass<Object>) proceedingJoinPoint.getTarget()).preProcess(message);

您需要知道泛型的实例化类型并具有相同类型的匹配消息对象。

如果消息在截获的函数调用的参数中,您可以按如下方式获取它们:

Object[] methodArguments = proceedingJoinPoint.getArgs();
Message<Integer> message = (Message<Integer>) methodArguments[0];

如果消息是第一个参数,它将在 methodArguments[0]