Я создал пользовательскую аннотацию, которая регистрирует выполнение метода. Это выглядит так:
Объявление аннотации:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}
Аспект:
@Aspect
@Component
public class LogExecutionTimeAspect {
@Around("@annotation(com.example.app.LogExecutionTime)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
final long startedAt = System.currentTimeMillis();
final Object proceed = joinPoint.proceed();
final long duration = System.currentTimeMillis() - startedAt;
System.out.printLn(joinPoint.getSignature() + " - " + duration);
return proceed;
}
}
Использование аннотации:
public class UsersStore {
private final UsersRepository usersRepository;
public UsersStore(UsersRepository usersRepository) {
this.usersRepository = usersRepository;
}
@LogExecutionTime
public List<User> findAll() {
return usersRepository.findAll();
}
@LogExecutionTime
public Integer countAll() {
return usersRepository.countAll();
}
}
Однако текущая реализация означает, что я должен применить эту аннотацию ко всем публичным методам. Который много кода, чтобы повторить. И так как я хочу контролировать время выполнения всех открытых методов моих репозиториев, я думаю, что может быть лучший способ.
Чего я хотел бы добиться, так это отдельной аннотации на уровне класса, которая измеряет время выполнения для каждого открытого метода в классе.
Я обнаружил, что ElementType.TYPE
предназначен для применения к классу, но я не знаю, как его использовать. По сути, я бы хотел:
@LogEachMethodExecutionTime // <--- What is the appropriate implementation?
public class UsersStore {
private final UsersRepository usersRepository;
public UsersStore(UsersRepository usersRepository) {
this.usersRepository = usersRepository;
}
public List<User> findAll() {
return usersRepository.findAll();
}
public Integer countAll() {
return usersRepository.countAll();
}
}
Есть идеи?