Пользовательская аннотация применяется к каждому методу в классе - PullRequest
0 голосов
/ 17 января 2019

Я создал пользовательскую аннотацию, которая регистрирует выполнение метода. Это выглядит так:

Объявление аннотации:

@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();
    }
}

Есть идеи?

...