編輯: 我不認爲您可以在您的案例中記錄每個「execute」方法的執行情況,而無需更改Foo或Stage類。因爲Stage ...類不是由容器管理的。只有在doSomething方法開始執行時(如果Foo類由Spring容器管理),才能記錄日誌,但無法控制它的執行流。
如果你的類是由Spring容器管理的,那麼你可以輕鬆地做到這一點。您應該簡單地爲Stage ...類編寫Spring AOP「around」方面,而不是Foo類。
下面是簡單的日誌記錄方面的一個例子:
@Component
@Aspect
@Order(value=2)
public class LoggingAspect {
@Around("execution(* com.blablabla.server..*.*(..))")
public Object logMethod(ProceedingJoinPoint joinPoint) throws Throwable{
final Logger logger = LoggerFactory.getLogger(joinPoint.getTarget().getClass().getName());
Object retVal = null;
try {
StringBuffer startMessageStringBuffer = new StringBuffer();
startMessageStringBuffer.append("Start method ");
startMessageStringBuffer.append(joinPoint.getSignature().getName());
startMessageStringBuffer.append("(");
Object[] args = joinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
startMessageStringBuffer.append(args[i]).append(",");
}
if (args.length > 0) {
startMessageStringBuffer.deleteCharAt(startMessageStringBuffer.length() - 1);
}
startMessageStringBuffer.append(")");
logger.trace(startMessageStringBuffer.toString());
StopWatch stopWatch = new StopWatch();
stopWatch.start();
retVal = joinPoint.proceed();
stopWatch.stop();
StringBuffer endMessageStringBuffer = new StringBuffer();
endMessageStringBuffer.append("Finish method ");
endMessageStringBuffer.append(joinPoint.getSignature().getName());
endMessageStringBuffer.append("(..); execution time: ");
endMessageStringBuffer.append(stopWatch.getTotalTimeMillis());
endMessageStringBuffer.append(" ms;");
logger.trace(endMessageStringBuffer.toString());
} catch (Throwable ex) {
StringBuffer errorMessageStringBuffer = new StringBuffer();
// Create error message
logger.error(errorMessageStringBuffer.toString(), e)
throw ex;
}
return retVal;
}
}
它可以用於非彈簧管理對象嗎?據我所知,spring在bean周圍創建一個代理,所以它實際上是調用代理而不是實際的對象本身 – goh
它只適用於spring管理的對象。您可以使用'@ Configurable'註釋來限定Stage對象,這樣即使您使用'new'運算符創建對象,它們也可以進行彈簧管理。然後'@ Around'方面將在執行方法上工作。 – Vikdor