Я сделал это, используя Spring AOP.
Когда-нибудь мне нужна информация о том, сколько времени требуется для выполнения некоторых методов в моем проекте (например, в примере контроллера).
В сервлета XML я положил
<aop:aspectj-autoproxy/>
Кроме того, мне нужно создать класс для аспектов:
@Component
@Aspect
public class SystemArchitecture {
@Pointcut("execution(* org.mywebapp.controller..*.*(..))")
public void businessController() {
}
}
И профилировщика аспект:
@Component
@Aspect
public class TimeExecutionProfiler {
private static final Logger logger = LoggerFactory.getLogger(TimeExecutionProfiler.class);
@Around("org.mywebapp.util.aspects.SystemArchitecture.businessController()")
public Object profile(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
logger.info("ServicesProfiler.profile(): Going to call the method: {}", pjp.getSignature().getName());
Object output = pjp.proceed();
logger.info("ServicesProfiler.profile(): Method execution completed.");
long elapsedTime = System.currentTimeMillis() - start;
logger.info("ServicesProfiler.profile(): Method execution time: " + elapsedTime + " milliseconds.");
return output;
}
@After("org.mywebapp.util.aspects.SystemArchitecture.businessController()")
public void profileMemory() {
logger.info("JVM memory in use = {}", (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()));
}
}
Вот и все. Когда я запрашиваю страницу из моего webapp, информация о времени выполнения метода и использовании памяти JVM выводится в моем файле журнала webapp.
Профилирование приложения Spring не отличается от профилирования любого другого приложения Java. Возможно, вы захотите расширить вопрос, чтобы получить более широкий выбор ответов. – skaffman