Вы можете сделать это, используя Spring AOP. Используйте аспекты для хранения некоторых данных @Before
, @After
или @Around
ваши методы.
Вы можете добавить свою пользовательскую аннотацию:
@Retention(RetentionPolicy.RUNTIME)
public @interface Profiling {
String value();
}
Создать аспект:
@Aspect
public class ProfilingAspect{
//for any method with @Profiling, no matter what the return type, name, or arguments are, call this method
@Around("execution(@foo.bar.packagename.Profiling * *(..)) && @annotation(profilingAnnotation)")
public Object logDuration(ProceedingJoinPoint joinPoint, Profiling profilingAnnotation) throws Throwable {
//capture the start time
long startTime = System.currentTimeMillis();
//execute the method and get the result
Object result = joinPoint.proceed();
//capture the end time
long endTime = System.currentTimeMillis();
//calculate the duration and save it somewhere
long duration = endTime - startTime;
logger.info(profilingAnnotation.value()+": "+duration+"ms");
//return the result to the caller
return result;
}
}
Аннотируйте ваши методы с помощью @Profiling
:
@Controller
public class HelloController{
@RequestMapping("/api/example/hello")
@Profiling("Hello World")
public @ResponseBody String getHelloWorld(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException("Sleep Interrupted", e);
}
return "Hello World";
}
}
При вызове метода будет регистрироваться что-то вроде: Hello World: 1007ms