自定义建议类
除了前面介绍的提供的建议类之外,您还可以实现自己的建议类。虽然您可以提供任何org.aopalliance.aop.Advice
的实现(通常是org.aopalliance.intercept.MethodInterceptor
),但我们通常建议您继承o.s.i.handler.advice.AbstractRequestHandlerAdvice
。这样做的好处是避免编写低级的面向方面的编程代码,并提供一个专门针对此环境使用的起点。
子类需要实现doInvoke()
方法,其定义如下
/**
* Subclasses implement this method to apply behavior to the {@link MessageHandler} callback.execute()
* invokes the handler method and returns its result, or null).
* @param callback Subclasses invoke the execute() method on this interface to invoke the handler method.
* @param target The target handler.
* @param message The message that will be sent to the handler.
* @return the result after invoking the {@link MessageHandler}.
* @throws Exception
*/
protected abstract Object doInvoke(ExecutionCallback callback, Object target, Message<?> message) throws Exception;
回调参数是为了方便起见,避免子类直接处理AOP。调用callback.execute()
方法会调用消息处理程序。
target
参数是为那些需要为特定处理程序维护状态的子类提供的,也许是通过在Map
中维护该状态,该Map
以目标为键。此功能允许将相同的建议应用于多个处理程序。RequestHandlerCircuitBreakerAdvice
使用此建议来为每个处理程序保持断路器状态。
message
参数是发送到处理程序的消息。虽然建议在调用处理程序之前无法修改消息,但它可以修改有效负载(如果它具有可变属性)。通常,建议会使用消息进行日志记录或在调用处理程序之前或之后将消息的副本发送到某个地方。
返回值通常是callback.execute()
返回的值。但是,建议确实有能力修改返回值。请注意,只有AbstractReplyProducingMessageHandler
实例会返回值。以下示例显示了一个自定义建议类,它扩展了AbstractRequestHandlerAdvice
public class MyAdvice extends AbstractRequestHandlerAdvice {
@Override
protected Object doInvoke(ExecutionCallback callback, Object target, Message<?> message) throws Exception {
// add code before the invocation
Object result = callback.execute();
// add code after the invocation
return result;
}
}
除了 `execute()` 方法之外,`ExecutionCallback` 还提供了一个额外的 `cloneAndExecute()` 方法。在调用可能在 `doInvoke()` 的单次执行中被多次调用的情况下,必须使用此方法,例如在 `RequestHandlerRetryAdvice` 中。这是必需的,因为 Spring AOP 的 `org.springframework.aop.framework.ReflectiveMethodInvocation` 对象通过跟踪链中最后调用的建议来维护状态。此状态必须在每次调用时重置。 有关更多信息,请参阅 ReflectiveMethodInvocation Javadoc。 |