我有一個Spring Boot應用程序,它有多個類共享一個可以發出Http請求的常見HttpUtil類。在過去,我已經使用了AspectJ在以下幾點:在Spring Boot應用程序中使用AspectJ監視REST調用的運行時間
@Around("execution(* com.gateway.TestGateway.getStatus(..))")
public Object GatewayStatus(ProceedingJoinPoint pjp) throws Throwable {
StopWatch watch = new StopWatch();
watch.start();
Object output = pjp.proceed();
watch.stop();
log.error("Call took - [" + (watch.getTime()) + "]ms");
return output;
}
這工作得很好,我會匹配getStatus()
方法與@Around
註釋,但網關結構現在有周圍的httputil調用代碼,只有我想要分析其餘的電話。新的網關的方法是這樣的:
final HttpUtil httpUtil; //Constructor injected by Spring.
public ResponseEntity<String> getResponse(final String serviceUrl, final HttpEntity<String> httpEntity) throws Exception {
ResponseEntity<String> response = null;
//Code here to verify the Entity
try{
response = httpUtil.postEntity(serviceUrl, httpEntity, String.class,
httpUtil.getRestTemplate());
//Logic here to work on the response.
}
catch(Exception e){
log.error("Error occurred");
}
return response;
}
我知道我可以重新因素這一點,或使用上的HttpUtil類方法本身的探查,但如何用AspectJ現有的方法中匹配的代碼片段?如在中,運行postEntity()
呼叫開始時和postEntity()
呼叫完成但之後該方法返回。
我不太熟悉Pointcuts和其他AspectJ屬性。我所要做的就是記錄執行時間,但我想了解更多關於AspectJ的信息。
感謝您的回覆。 Spring AOP顯然不允許調用。我在切入點的「內部」部分遇到問題。我可以用什麼來代替通話? –
延遲響應 - 但如果您使用Spring AOP,我認爲您必須堅持執行切入點。 Spring AOP比AspectJ支持更少的切入點。如果你仍然不想把切入點放在HttpUtil類上,你可以定義一個只有HttpUtil postEntity()調用的「代理」方法,然後把執行切入點放在代理方法的周圍。 – Luke